2015-07-10 125 views
0

我有一個工作代碼,它將熊貓數據框顯示爲圖表中的2條線圖。我也有一個數據框,在同一個圖表上顯示一個條形圖。對於2個數據框,我有x軸的日期。因爲這兩個數據框有日期,所以我的座標軸最後只有整數(1,2,3,4,5,6 ...)而不是日期。熊貓在x軸上繪製xticks

我認爲這條線df1 = df.set_index(['date'])指定我想要的X軸已經和當我不在圖上繪製條形圖時,日期很好地顯示,但是當我繪製條形圖時,整數顯示在軸上。

我2個dataframes:

df1: 
date  line1 line2 
2015-01-01 15.00 23.00 
2015-02-01 18.00 10.00 

df2: 
date  quant 
2015-01-01 500 
2015-02-01 600 

我的代碼:

df1 =pd.DataFrame(result, columns =[ 'date','line1', 'line2']) 
df1 = df.set_index(['date']) 

df2 =pd.DataFrame(quantity, columns =[ 'quant','date']) 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax2=ax.twinx() 
ax.set_ylim(0,100) 
ax2.set_ylim(0,2100) 

df1.line1.plot(color = 'red', ax = ax) 
df1.line2.plot(color = 'blue', ax = ax) 
df2.["quant"].plot(kind = 'bar', ax =ax2, width =0.4) 
plt.show() 

enter image description here

df1: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 12 entries, 0 to 11 
Data columns (total 3 columns): 
date  12 non-null object 
line1 12 non-null float64 
line2  12 non-null float64 
dtypes: float64(2), object(1) 
memory usage: 384.0+ bytes 
None 

df2 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 11 entries, 0 to 10 
Data columns (total 2 columns): 
quant   11 non-null int64 
date 11 non-null object 
dtypes: int64(1), object(1) 
memory usage: 264.0+ bytes 
None 

回答

1

你可以只使用ax.plot(df1.date, df1.line1)matplotlib.pyplot會自動處理日期。

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

# your data 
# =================================== 
np.random.seed(0) 
df1 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), line1=np.random.randint(10, 30, 12), line2=np.random.randint(20, 25, 12))) 

Out[64]: 
     date line1 line2 
0 2015-01-01  22  22 
1 2015-02-01  25  21 
2 2015-03-01  10  20 
3 2015-04-01  13  21 
4 2015-05-01  13  21 
5 2015-06-01  17  20 
6 2015-07-01  19  21 
7 2015-08-01  29  24 
8 2015-09-01  28  23 
9 2015-10-01  14  20 
10 2015-11-01  16  23 
11 2015-12-01  22  20 



df2 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), quant=100*np.random.randint(3, 10, 12))) 

Out[66]: 
     date quant 
0 2015-01-01 500 
1 2015-02-01 600 
2 2015-03-01 300 
3 2015-04-01 400 
4 2015-05-01 600 
5 2015-06-01 800 
6 2015-07-01 600 
7 2015-08-01 600 
8 2015-09-01 900 
9 2015-10-01 300 
10 2015-11-01 400 
11 2015-12-01 400 

# plotting 
# =================================== 
fig, ax = plt.subplots(figsize=(10, 8)) 
ax.plot(df1.date, df1.line1, label='line1', c='r') 
ax.plot(df1.date, df1.line2, label='line2', c='b') 
ax2 = ax.twinx() 
ax2.set_ylabel('quant') 
ax2.bar(df2.date, df2.quant, width=20, alpha=0.1, color='g', label='quant') 
ax.legend(loc='best') 
ax.set_xticks(ax.get_xticks()[::2]) 

enter image description here

後續行動(更新):

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

# your data 
# =================================== 
np.random.seed(0) 
df1 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), line1=np.random.randint(10, 30, 12), line2=np.random.randint(20, 25, 12))).set_index('date') 
df2 = pd.DataFrame(dict(date=pd.date_range('2015-01-01', periods=12, freq='MS'), quant=100*np.random.randint(3, 10, 12))).set_index('date') 
df2 = df2.drop(df2.index[4]) 
print(df1) 
print(df2) 
      line1 line2 
date      
2015-01-01  22  22 
2015-02-01  25  21 
2015-03-01  10  20 
2015-04-01  13  21 
2015-05-01  13  21 
2015-06-01  17  20 
2015-07-01  19  21 
2015-08-01  29  24 
2015-09-01  28  23 
2015-10-01  14  20 
2015-11-01  16  23 
2015-12-01  22  20 
      quant 
date    
2015-01-01 500 
2015-02-01 600 
2015-03-01 300 
2015-04-01 400 
2015-06-01 800 
2015-07-01 600 
2015-08-01 600 
2015-09-01 900 
2015-10-01 300 
2015-11-01 400 
2015-12-01 400 

# plotting 
# =================================== 
fig, ax = plt.subplots(figsize=(10, 8)) 
ax.plot(df1.index, df1.line1, label='line1', c='r') 
ax.plot(df1.index, df1.line2, label='line2', c='b') 
ax2 = ax.twinx() 
ax2.set_ylabel('quant') 
ax2.bar(df2.index, df2.quant, width=20, alpha=0.1, color='g', label='quant') 
ax.legend(loc='best') 
ax.set_xticks(ax.get_xticks()[::2]) 

enter image description here

+0

謝謝,我得到了這個錯誤:ax.plot(df.date,df.line1, label ='before',c ='r')ValueError:無效文字float():2015-05-01 – jxn

+0

@jxn哪條線會引發該錯誤?你是在我的文章中運行示例代碼還是將它應用到自己的數據集? –

+0

對不起,這是我自己的數據集 – jxn