[英]Pandas Plotting from Pivot Table
我基本上試圖重現氣候圖,顯示不同地點的全年平均溫度和降水量。
我通過以下方式從我的csv生成了一個數據透視表:
data = pd.read_csv("05_temp_rain_v2.csv")
pivot = data.pivot_table(["rain(mm)","temp(dC)"], ["loc","month"])
文本形式的樣本數據:
loc,lat,long,year,month,rain(mm),temp(dC)
Adria_-_Bellombra,45.011129,12.034126,1994,1,45.6,4.6
Adria_-_Bellombra,45.011129,12.034126,1994,2,31.4,4
Adria_-_Bellombra,45.011129,12.034126,1994,3,1.6,10.7
Adria_-_Bellombra,45.011129,12.034126,1994,4,74.4,11.5
Adria_-_Bellombra,45.011129,12.034126,1994,5,26,17.2
Adria_-_Bellombra,45.011129,12.034126,1994,6,108.6,20.6
數據透視表:
由於我正在處理各種位置,我正在迭代它們:
locations=pivot.index.get_level_values(0).unique()
for location in locations:
split=pivot.xs(location)
rain=split["rain(mm)"]
temp=split["temp(dC)"]
plt.subplots()
temp.plot(kind="line",color="r",).legend()
rain.plot(kind="bar").legend()
示例繪圖輸出如下所示:
為什么我的溫度值從2月(2)開始繪制?
我認為這是因為溫度值列在第二列中。
從數據透視表處理和繪制不同數據(兩列)的正確方法是什么?
這是因為line
和bar
不能以相同的方式設置xlim
。 在條形圖的情況下,x軸被解釋為分類數據,而它被解釋為線圖的連續數據。 結果是xlim
和xticks
在兩種情況下都沒有相同的設置。
考慮一下:
In [4]: temp.plot(kind="line",color="r",)
Out[4]: <matplotlib.axes._subplots.AxesSubplot at 0x117f555d0>
In [5]: plt.xticks()
Out[5]: (array([ 1., 2., 3., 4., 5., 6.]), <a list of 6 Text xticklabel objects>)
其中ticks的位置是一個從1到6的浮點數組。
和
In [6]: rain.plot(kind="bar").legend()
Out[6]: <matplotlib.legend.Legend at 0x11c15e950>
In [7]: plt.xticks()
Out[7]: (array([0, 1, 2, 3, 4, 5]), <a list of 6 Text xticklabel objects>)
其中ticks的位置是int的數組,范圍從0到5 。
因此,更容易替換此部分:
temp.plot(kind="line", color="r",).legend()
rain.plot(kind="bar").legend()
通過:
rain.plot(kind="bar").legend()
plt.plot(range(len(temp)), temp, "r", label=temp.name)
plt.legend()
感謝jeanrjc的回答和這個帖子,我覺得我終於很滿意了!
for location in locations:
#print(pivot.xs(location, level=0))
split=pivot.xs(location)
rain=split["rain(mm)"]
temp=split["temp(dC)"]
fig = plt.figure()
ax1 = rain.plot(kind="bar")
ax2 = ax1.twinx()
ax2.plot(ax1.get_xticks(),temp,linestyle='-',color="r")
ax2.set_ylim((-5, 50.))
#ax1.set_ylim((0, 300.))
ax1.set_ylabel('Precipitation (mm)', color='blue')
ax2.set_ylabel('Temperature (°C)', color='red')
ax1.set_xlabel('Months')
plt.title(location)
labels = ['Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dez']
#plt.xticks(range(12),labels,rotation=45)
ax1.set_xticklabels(labels, rotation=45)
您可以循環遍歷groupby
操作的結果:
for name, group in data[['loc', 'month', 'rain(mm)', 'temp(dC)']].groupby('loc'):
group.set_index('month').plot()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.