熊猫从数据透视表绘图

cir*_*cir 5 python pivot-table matplotlib python-3.x pandas

我基本上试图重现气候图,显示不同地点的全年平均温度和降水量.

我通过以下方式从我的csv生成了一个数据透视表:

data = pd.read_csv("05_temp_rain_v2.csv")
pivot = data.pivot_table(["rain(mm)","temp(dC)"], ["loc","month"])  
Run Code Online (Sandbox Code Playgroud)

文本形式的样本数据:

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
Run Code Online (Sandbox Code Playgroud)

数据透视表:

在此输入图像描述

由于我正在处理各种地点,我正在迭代它们:

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()
Run Code Online (Sandbox Code Playgroud)

示例绘图输出如下所示:

在此输入图像描述

为什么我的温度值从2月(2)开始绘制?
我认为这是因为温度值列在第二列中.

从数据透视表处理和绘制不同数据(两列)的正确方法是什么?

jrj*_*rjc 7

这是因为linebar情节没有设置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>)
Run Code Online (Sandbox Code Playgroud)

其中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>)
Run Code Online (Sandbox Code Playgroud)

其中ticks的位置是int的数组,范围从0到5.

因此,更容易替换此部分:

temp.plot(kind="line", color="r",).legend()
rain.plot(kind="bar").legend()
Run Code Online (Sandbox Code Playgroud)

通过:

rain.plot(kind="bar").legend()
plt.plot(range(len(temp)), temp, "r", label=temp.name)
plt.legend()
Run Code Online (Sandbox Code Playgroud)

酒吧线情节熊猫


Ian*_*anS 0

您可以循环groupby操作的结果:

for name, group in data[['loc', 'month', 'rain(mm)', 'temp(dC)']].groupby('loc'):
    group.set_index('month').plot()
Run Code Online (Sandbox Code Playgroud)