2016-05-23 8 views
1

Ich benutze Pandas eingebaute .plot Befehl, um einige lang-ish Zeitreihen zu plotten.Warum zeigen meine Jahr-Ticks mit pandas.plot immer die Jahre, die in 9 enden?

Aber meine Datums-Ticks sind immer Jahre, die standardmäßig mit 9 enden. screenshot of plot

Warum ist das so, und wie kann ich es ändern? Jahre, die in 0 enden, würden viel schöner aussehen.

Versuchen, das Fenster der Achse mit plt.xlim('1966', '2013') oder etwas Ähnliches einzustellen, tut auch nichts über Plots Fetisch für die Jahre, die in 9 enden (und 4, wenn Sie "hineinzoomen", wie oben gezeigt).

Es scheint auch nichts mit dem Anfang und dem Ende der Daten im Quelldatenrahmen zu tun zu haben.

hier ist ein minimal, leer, Beispiel:

dfdates = pd.date_range('01/01/1942', '01/01/2018', freq = 'MS') 
dfzeros = np.zeros((len(dfdates))) 
header_test = pd.MultiIndex.from_product([['zero'],['zero'], ['zero'], ['zero'], ['zero'], ['zero']], names = ['stuff1', 'stuff2', 'stuff3', 'stuff4', 'stuff5', 'stuff6']) 
Big_df = pd.DataFrame(dfzeros, index = dfdates, columns = header_test) 

Big_df.plot() 
plt.show() 

... Und dies führt in dem für mich: empty test plot

Und ich kann die 9s am Ende ändern, unabhängig davon, ob Ich setze ein Fenster mit plt.xlim oder wenn ich die Anfangs- und Endjahre, -monate oder -tage von dfdates ändere, so ist es nicht so einfach wie "Start des Dataframes + 10 Jahre" oder ähnliches, und meine große Kopfzeile beeinflusst diese auch nicht.

Ich könnte wahrscheinlich mehr vernünftige Ticks pro Hand setzen, aber ich würde lieber wissen, warum es so schwer ist, Jahre mit 9 am Ende zu verwenden.

EDIT So, hier ist was passiert, wenn ich Grundstück, @ lanery Antwort mit: plot with double ticks Beachten Sie die Doppel Zecken im Bereich des Grundstücks, wo ich die benutzerdefinierten Ticks (bei 1965 beginnen). Alle meine Datenrahmen beginnen bei 1940, aber viele sind leer, bis zu einem gewissen Punkt, wo ich anfange, Daten zu bekommen, abhängig von dem fraglichen Datensatz. Ich kann das mit plt.xlim('1965','2015') abschneiden, aber ich habe es in dieser Handlung gelassen, um zu zeigen, was passiert.

Antwort

1

plt.xlim mit datetime Objekte Seit Einstellung, so etwas wie

plt.xlim(pd.datetime(1966, 1, 1), pd.datetime(2013, 1, 1)) 

hat den Trick nicht, ich denke, die beste Vorgehensweise benutzerdefinierte xticks und xticklabels eingestellt ist. Dies kann durch getan werden wie so

dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5)) 
ax.xaxis.set_ticks(dates) 
ax.xaxis.set_ticklabels(dates.strftime('%Y')) 

Ein vollständiges Beispiel mit einigen zufälligen Daten:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

np.random.seed(17) 
years = pd.date_range(pd.datetime(1990, 1, 1), pd.datetime(2015, 1, 1), freq='MS') 
random_data = np.asarray(np.split(np.cumsum(np.random.randn(years.size*3)), 3)).T 
df = pd.DataFrame(random_data, columns=['A', 'B', 'C'], index=years) 

# all of the relevant plotting and xtick formatting 
fig = plt.figure() 
ax = fig.add_subplot(111) 

df.plot(ax=ax) 

# select range of years for the x-axis as well as major tick spacing 
dates = pd.date_range('1990', '2015', freq=pd.DateOffset(years=5)) 
ax.xaxis.set_ticks(dates) 
ax.xaxis.set_ticklabels(dates.strftime('%Y')) 
# dates.strftime('%Y') = (['1990', '1995',...,'2010', '2015']) 

ax.grid() 

enter image description here

+0

Es funktioniert mit meinem Beispiel, aber mit den realen Daten, es nicht. (Oder tatsächlich, es tut, keine Fehler, und das Fenster bewegt sich, aber die 9 bleiben). –

+0

'pandas' plotten legt mehr Wert auf automatische Formatierung Plots, so dass ich gehofft hatte, dass die Einstellung der' xlim' wäre eine einfache Möglichkeit zur Anpassung der automatisch gewählten großen Tickmarks (vor allem, nachdem es in Ihrem Beispiel funktionierte). Da dies nicht der Fall ist, müssen Sie wahrscheinlich mit einigen Anpassungen überschreiben, vielleicht hilft dieses Beispiel: http: // stackoverflow.com/questions/3486121/how-to-plot-daten-gegen-spezifische-daten-auf-der-x-achse-using-matplotlib – lanery

+0

@JC_CL Ich aktualisierte meine Antwort zu zeigen, wie benutzerdefinierte 'xticks 'und' xticklabels '. Es kommt im Grunde nur auf 3 Zeilen, also sollte die Anwendung dieser Lösung auf Ihren Datenrahmen relativ problemlos sein (wenn Sie also noch keine Abhilfe gefunden haben). – lanery

Verwandte Themen