Ich möchte in der Lage sein, die Haupt- und Neben-Xticks und ihre Beschriftungen für ein Zeitreihendiagramm festzulegen, das aus einem Pandas-Zeitreihenobjekt erstellt wurde.
Auf der Seite "Was ist neu" von Pandas 0.9 heißt es:
"Sie können entweder to_pydatetime verwenden oder einen Konverter für den Zeitstempeltyp registrieren."
Aber ich kann nicht herausfinden, wie das geht, damit ich die Befehle matplotlib ax.xaxis.set_major_locator
und ax.xaxis.set_major_formatter
(und minor) verwenden kann.
Wenn ich sie verwende, ohne die Pandas-Zeiten zu konvertieren, sind die Häkchen und Beschriftungen auf der x-Achse falsch.
Mit dem Parameter 'xticks' kann ich die Haupt-Ticks an pandas.plot übergeben und dann die Haupt-Tick-Beschriftungen festlegen. Ich kann nicht herausfinden, wie man die kleinen Zecken mit diesem Ansatz macht. (Ich kann die Beschriftungen auf die von pandas.plot festgelegten Standard-Minor-Ticks setzen.)
Hier ist mein Testcode:
import pandas
print 'pandas.__version__ is ', pandas.__version__
print 'matplotlib.__version__ is ', matplotlib.__version__
dStart = datetime.datetime(2011,5,1) # 1 May
dEnd = datetime.datetime(2011,7,1) # 1 July
dateIndex = pandas.date_range(start=dStart, end=dEnd, freq='D')
print "1 May to 1 July 2011", dateIndex
testSeries = pandas.Series(data=np.random.randn(len(dateIndex)),
index=dateIndex)
ax = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
testSeries.plot(ax=ax, style='v-', label='first line')
# using MatPlotLib date time locators and formatters doesn't work with new
# pandas datetime index
ax.xaxis.set_minor_locator(matplotlib.dates.WeekdayLocator(byweekday=(1),
interval=1))
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.xaxis.grid(False, which="major")
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('\n\n\n%b%Y'))
plt.show()
# set the major xticks and labels through pandas
ax2 = plt.figure(figsize=(7,4), dpi=300).add_subplot(111)
xticks = pandas.date_range(start=dStart, end=dEnd, freq='W-Tue')
print "xticks: ", xticks
testSeries.plot(ax=ax2, style='-v', label='second line',
xticks=xticks.to_pydatetime())
ax2.set_xticklabels([x.strftime('%a\n%d\n%h\n%Y') for x in xticks]);
# set the text of the first few minor ticks created by pandas.plot
# ax2.set_xticklabels(['a','b','c','d','e'], minor=True)
# remove the minor xtick labels set by pandas.plot
ax2.set_xticklabels([], minor=True)
# turn the minor ticks created by pandas.plot off
# plt.minorticks_off()
plt.show()
print testSeries['6/4/2011':'6/7/2011']
und seine Ausgabe:
pandas.__version__ is 0.9.1.dev-3de54ae
matplotlib.__version__ is 1.1.1
1 May to 1 July 2011 <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-01 00:00:00, ..., 2011-07-01 00:00:00]
Length: 62, Freq: D, Timezone: None
xticks: <class 'pandas.tseries.index.DatetimeIndex'>
[2011-05-03 00:00:00, ..., 2011-06-28 00:00:00]
Length: 9, Freq: W-TUE, Timezone: None
2011-06-04 -0.199393
2011-06-05 -0.043118
2011-06-06 0.477771
2011-06-07 -0.033207
Freq: D
Update: Ich konnte dem gewünschten Layout näher kommen, indem ich eine Schleife zum Erstellen der wichtigsten xtick-Labels verwendete:
# only show month for first label in month
month = dStart.month - 1
xticklabels = []
for x in xticks:
if month != x.month :
xticklabels.append(x.strftime('%d\n%a\n%h'))
month = x.month
else:
xticklabels.append(x.strftime('%d\n%a'))
Dies ist jedoch ein bisschen wie bei der x-Achse mit ax.annotate
: möglich, aber nicht ideal.
plot
Funktion einfach völlig ignorieren und alle Häkchen nach dem Plotten setzen, indem Sie die matplotlib-Methoden des zurückgegebenen ax
Objekts verwenden (z. B. ax.set_xticks
)?