2016-06-08 122 views
1

我得到一個帶有變量lenths的時間跨度值的pandas DataFrame。我想繪製每個時間跨度值與時間跨度長度的水平線。用matplotlib繪製大熊貓period_range - 設置軸的頻率

TypeError: Axis must have `freq` set to convert to Periods 

所以我的問題是如何設置我的x軸的頻率

非常感謝您的幫助

:Therfore,我通過

ax0=fig.add_axes([.16,.2,0.8,.7]) 
ax0.plot_date(data['periodIndex'], data['value']) 

產生轉換的時間跨度到PeriodIndex

Axel

UPDATE

這是熊貓數據框中我想繪製

 start  stop   A   B   C 
ID                  
1 2015-08-17 2015-08-25 -5.684246 -34.759047 10.714920 
2 2015-08-25 2015-09-02 -10.850721 -78.443556 8.362215 
3 2015-09-02 2015-09-15 -7.139351 -47.814199 9.300612 
4 2015-09-15 2015-09-21 -7.822367 -56.895241 5.683696 
5 2015-09-21 2015-09-29 -6.491543 -42.947744 8.984596 
6 2015-09-29 2015-10-05 -9.897980 -67.985256 11.198583 

我解決了這個問題的一部分,現在它看起來像 this 通過下面的代碼

firstDate=df.ix[df.index[0]]['start'] 

fig=plt.figure(figsize=(9*1.5,6*1.5)) 
ax0=fig.add_axes([.15,.2,0.75,.7]) 

ax0.set_xticks(df['start_abs']) 
ax0.set_xticklabels([i.date() for i in df['start']], rotation='vertical') 

B=ax0.twinx() 
B.set_ylim(-200,0) 

for _index, _series in df.iterrows(): 
    start=_series['start'] 
    stop=_series['stop'] 
    df.ix[_index, 'start_abs']=(start-firstDate).days 
    df.ix[_index, 'width_abs']=(stop-start).days 
    df.ix[_index, 'stop_abs']=(stop-firstDate).days 

    line_A=ax0.hlines(y=df.ix[_index,'A'], xmin=df.ix[_index, 'start_abs'], xmax=df.ix[_index, 'stop_abs'], colors='r') 
    line_A.set_linewidths(3) 
    text_A=ax0.text(df.ix[_index, 'start_abs'], df.ix[_index,'A'], '{a:4.2f}'.format(a=df.ix[_index,'A']), fontsize=8, color='r') 

    line_B=B.hlines(y=df.ix[_index,'B'], xmin=df.ix[_index,'start_abs'], xmax=df.ix[_index,'stop_abs'], colors='k') 
    line_B.set_linewidths(3) 
    text_B=B.text(df.ix[_index,'start_abs'], df.ix[_index,'B'], '{a:4.2f}'.format(a=df.ix[_index,'B']), fontsize=8, color='k') 

plt.show() 
+0

請提供'data' – piRSquared

+0

很抱歉,但如果你需要幫助,你必須改寫你的問題,並提供一些數據行的一個例子。所提供的示例並不清楚,因爲您討論的是週期索引轉換,並且代碼未顯示此轉換。 'DF [ '日期']。dt.to_period( 'H')'。 – Romain

回答

0

我構建數據證明我認爲是你的問題。

如果您只爲索引的特定範圍填充數據的數據幀,然後對其進行繪製,則只會在數據不爲空時生成一行。

import pandas as pd 
import numpy as np 

ts = pd.date_range(end='2016-03-31', periods=250, freq='D') 

np.random.seed([3,1415]) 
ranges = pd.DataFrame((np.random.choice(xrange(100), (2, 10)) + 
         np.array([[0], [150]])), 
         columns=list('ABCDEFGHIJ')) 

df = pd.DataFrame(index=ts) 
count = 1 
for i, c in ranges.iteritems(): 
    s, e = c 
    df.loc[ts[s]:ts[e], i] = count 
    count += 1 

df.plot() 

enter image description here