Pandalar zaman serileri, x ekseni büyük ve küçük işaretler ve etiketler ayarlıyor


87

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_locatorve 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

Xaxis'te garip tarihler içeren grafik

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

Doğru tarihlere sahip grafik

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.


1
Bunun soruyu gerçekten yanıtlamadığını biliyorum, ancak genel bir yaklaşım olarak bir arsanın nasıl göründüğünü gerçekten önemsediğimde, genellikle bunun bir vektör versiyonunu almaya ve Illustrator veya Inkscape'de güzel görünmesini sağlamaya çalışırım. Tanıdığım çoğu insanın da aynısını yaptığını gördüm.
John McDonnell

2
plotDöndürülen axnesnenin (örneğin, ax.set_xticks) matplotlib yöntemlerini kullanarak , pandalar işlevinin argümanlarını tamamen yok sayabilir ve çizimden sonra tüm işaretleri ayarlayabilir misiniz?
BrenBarn

@BrenBarn Matplotlib yöntemleri için pandas datetime yerine tarihin python tarihi olarak nasıl alınacağını çözemedim. Bmu'nun cevabı, çizimden önce tarihleri ​​dönüştürerek bunu düzeltir.
brenda

Yanıtlar:


89

Her ikisi pandasve keneleri bulmak için matplotlib.dateskullanın matplotlib.units.

Ancak matplotlib.dates, keneleri manuel olarak ayarlamanın uygun yolları varken , pandalar şimdiye kadar otomatik biçimlendirmeye odaklanmış gibi görünüyor ( pandalarda tarih dönüştürme ve biçimlendirme koduna bir göz atabilirsiniz ).

Bu yüzden şu an için kullanımı daha makul görünüyor matplotlib.dates(@BrenBarn tarafından yorumunda belirtildiği gibi).

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

idx = pd.date_range('2011-05-01', '2011-07-01')
s = pd.Series(np.random.randn(len(idx)), index=idx)

fig, ax = plt.subplots()
ax.plot_date(idx.to_pydatetime(), s, 'v-')
ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1),
                                                interval=1))
ax.xaxis.set_minor_formatter(dates.DateFormatter('%d\n%a'))
ax.xaxis.grid(True, which="minor")
ax.yaxis.grid()
ax.xaxis.set_major_locator(dates.MonthLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n%Y'))
plt.tight_layout()
plt.show()

pandas_like_date_fomatting

(benim yerel ayarım Almanca, yani Salı [Salı] Dienstag [Di] olur)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.