web-dev-qa-db-ja.com

Pandasピボットテーブルからのプロット

私は基本的に、さまざまな場所の年間平均気温と降水量を示す気候図を再現しようとしています。

次の方法で、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

ピボットテーブル:

enter image description here

私はさまざまな場所を扱っているので、それらを繰り返し処理しています。

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()

プロット出力の例を以下に示します。

enter image description here

2月(2)から温度値がプロットされるのはなぜですか?
温度値が2列目に記載されているためだと思います。

ピボットテーブルからさまざまなデータ(2列)を処理してプロットする適切な方法は何でしょうか?

5
cir

これは、lineプロットとbarプロットがxlimを同じように設定しないためです。 x軸は、棒グラフの場合はカテゴリデータとして解釈されますが、折れ線グラフの場合は連続データとして解釈されます。その結果、xlimxticksは両方の状況で同じように設定されません。

このことを考慮:

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

ここで、ティックの位置は、1から6の範囲のfloatの配列です。

そして

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

ここで、目盛りの位置は、0から5の範囲のintの配列です。

したがって、この部品を交換する方が簡単です。

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()

bar line plot pandas

7
jrjc

おかげで 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)  

次の出力を受け取ります。これは、意図したものに非常に近いものです。 sample plot

2
cir

groupby操作の結果をループすることができます。

for name, group in data[['loc', 'month', 'rain(mm)', 'temp(dC)']].groupby('loc'):
    group.set_index('month').plot()
0
IanS