2013-10-16 25 views
8

Matplotlib ile bir pandalar zaman serisi nesnesini data çizmek istiyorum. Basit bir çizgi grafik data.plot() için, x ekseni tarih formatını ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S')) ile başarıyla değiştirebildim. Ancak, data.plot(kind='bar') çubuk grafik için aynı şeyi yapamıyorum. Ve grafik görünmezdi. Pandalar çubuk grafik için veri formatını değiştirmek için bir yolu var mı? Plt.bar yöntemiyle bir grafik oluşturabileceğimi biliyorum, ancak daha karmaşık veriler için pandaların yığılmış çubuk grafiğini kullanmam gerekiyor.Pandas çubuk grafiğinde x ekseni DateFormat ayarlanamıyor

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import numpy as np 
import pandas as pd 
import datetime as dt 
import time 

n=20 
duration=1000 
now=time.mktime(time.localtime()) 
timestamps=np.linspace(now,now+duration,n) 
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps] 
values=np.sin((timestamps-now)/duration*2*np.pi) 
data=pd.Series(values, index=dates) 

fig=figure(figsize(5,5)) 
ax=fig.add_subplot(111) 
data.plot(kind='bar') 
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d %H:%M:%S')) 

cevap

17

pandalar basitçe elbette matplotlib ile özdeş (yığın) barchart oluşturabilir matplotlib kullandığı. Bunun için sadece Panda'ları kullanmanın bir nedeni yok.

Ancak bu durumda yardımcı olmayacaktır. Matplotlib'in bar() tarihleri ​​xvalues'ı tarihlerden floatlara değiştirir, dolayısıyla DateFormatter artık çalışmıyor. Xticks'i ax.get_xticks() ile kontrol edebilirsiniz.

Sana xticks tarihleri ​​yapmak nasıl görmüyorum ama xticklabels kendiniz geçersiz kılabilirsiniz:

ax.set_xticklabels([dt.strftime('%Y-%m-%d %H:%M:%S') for dt in data.index.to_pydatetime()]) 
+0

teşekkürler. Görüyorum ki 'ax.set_xticklabels' pandas komplosu için bile çalışıyor. – KLI

+0

Bu, "groupby" ile gruplandırılmış panda DataFrames için çalışmıyor: AttributeError: 'MultiIndex' nesnesinin 'to_pydatetime' özelliği yoktur. – mjp

0

o zaman kullanarak yukarıdaki cevap olarak aynı şeyi yapabilir groupby kullanarak verilerinizi gruplandırılmış varsa :

new_ticks = [] 
for dt in data.index: 
    new_ticks.append(datetime.datetime(dt[0],dt[1],1)) 
ax.set_xticklabels([dt.strftime('%Y-%m') for dt in new_ticks]) 

Maden toplandı ve index demet yalnızca örneğin (2009,4) nedenle ay iki gruba ayrıldı. Açıkçası, tuple (yani gün, saat) daha fazla yönleri varsa, o zaman datetime işlevi

İlgili konular