Bir Pandas zaman serisi nesnesinden çizilen bir zaman serisi grafiği için büyük ve küçük xticks ve etiketlerini ayarlayabilmek istiyorum.
Pandas 0.9 "yenilikler" sayfası şunu söylüyor:
"to_pydatetime kullanabilir veya Zaman Damgası türü için bir dönüştürücü kaydedebilirsiniz"
ancak matplotlib ax.xaxis.set_major_locator
ve ax.xaxis.set_major_formatter
(ve minör) komutlarını kullanabilmek için bunu nasıl yapacağımı çözemiyorum .
Bunları pandaların zamanlarını dönüştürmeden kullanırsam, x ekseni onay işaretleri ve etiketler yanlış sonuçlanır.
'Xticks' parametresini kullanarak, büyük onay işaretlerini pandas.plot'a iletebilirim ve ardından ana işaret etiketlerini ayarlayabilirim. Bu yaklaşımı kullanarak küçük kenelerin nasıl yapılacağını çözemiyorum. (Etiketleri pandas.plot tarafından belirlenen varsayılan küçük işaretler üzerine ayarlayabilirim)
İşte test kodum:
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']
ve çıktısı:
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
Güncelleme: Büyük xtick etiketlerini oluşturmak için bir döngü kullanarak istediğim düzene yaklaşabildim:
# 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'))
Ancak, bu biraz x eksenini kullanarak yapmaya benzer ax.annotate
: mümkün ama ideal değil.