SORU
18 EKİM 2012, PERŞEMBE


Pandalar arsa ayarını x ekseninde büyük ve küçük kene ve etiketler timeseries

Serisi grafik Pandalar bir zaman serisi nesne çizilen bir süre için büyük ve küçük xticks ve onların etiketleri ayarlamak mümkün olmak istiyorum.

Pandalar 0.9 "yenilikler" diyor: sayfa

< . p ^"to_pydatetime veya kullanmak için bir dönüştürücü kayıt da yapabilirsiniz Zaman damgası türü"

ama matplotlib kullanabilirsiniz ax.xaxis.set_major_locator ax.xaxis.set_major_formatter (ve) küçük komutları nasıl yapacağımı çözemiyorum.

Eğer pandalar kez dönüştürmeden onları kullanırsam, x ekseni, kene ve etiketler yanlış.

'Xticks' parametresi pandalar için büyük keneler geçebilir.kullanarak arsa, ve sonra büyük onay etiketleri ayarlayın. Küçük keneler bu yaklaşımı kullanarak nasıl yapacağımı çözemiyorum. (Varsayılan küçük keneler pandalar tarafından belirlenen etiketleri ayarlayabiliyorum.arsa)

İşte benim test kodu:

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 çıkış

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

Graph with strange dates on xaxis

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

Graph with correct dates

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 .NET etiketleri oluşturmak için bir döngü kullanarak istediğim düzeni daha yakın almak mümkün oldum:

# 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'))

Ama bu x ekseni kullanarak balta yapmak gibidir.açıklama, mümkün değil ama ideal.

CEVAP
2 Aralık 2012, Pazar


Her iki pandas matplotlib.dates kene bulmak için matplotlib.units kullanın.

Ama süre matplotlib.dates rahat ve kolay bir şekilde ayarlamak için keneler el ile, pandalar gibi görünüyor odağı otomatik biçimlendirme şimdiye kadar (bir bak code tarih dönüştürme ve biçimlendirme pandalar).

Şu an için matplotlib.dates @onun yorum BrenBarn tarafından belirtildiği gibi) kullanmak daha makul görünüyor.

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 Salı [Salı] Salı [Di]) olur Alman

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boburnham

    boburnham

    11 Temmuz 2006
  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008