按多个值分组并绘制结果。

13

我正在使用一些关于杀菌剂使用情况的数据,其中包括年份、杀菌剂、使用量,以及一些与此无关的列在panda DataFrame中。它看起来有点像:

Year, State,      Fungicide, Value
2011, California, A,         12879
2011, California, B,         29572
2011, Florida,    A,         8645
2011, Florida,    B,         19573
2009, California, A,         8764
2009, California, B,         98643,
...
我希望能够获得一个单一的图表,显示随着时间推移使用的总杀菌剂量,并为每种杀菌剂绘制一条线(用不同的颜色)。我已经使用了.groupby来获取每年使用的每种杀菌剂的总量。
apple_fplot = df.groupby(['Year','Fungicide'])['Value'].sum()

这给了我想要绘制的数值,类似于:

Year, Fungicide, Value
...
2009, A,        128635
      B,        104765
2011, A,        154829
      B,        129865

现在我需要绘制一个图表,使得每种杀菌剂(A、B等)在同一张图上成为单独的线,并表示出其随时间变化的值。

有没有一种方法可以不将所有内容分开而完成这个任务?请原谅我的无知,我刚接触Python,还在逐渐熟悉它。


你不能也按杀菌剂进行分组吗? - Tomasz Kaminski
3个回答

11

如果您想要一个清晰的解决方案,可以正确地打印legendxticks,那么您可以:

apple_fplot = df.groupby(['Year','Fungicide'])['Value'].sum()
plot_df = apple_fplot.unstack('Fungicide').loc[:, 'Value']
plot_df.index = pd.PeriodIndex(plot_df.index.tolist(), freq='A')
plot_df.plot()

输入图像描述 对于 subplots,只需将相应的 关键字 设置为 True:

plot_df.plot(subplots=True)

获取:

图片描述


谢谢,这个很好用。顺便问一下,我能修改这段代码来为每行生成一个图吗?我发现我有太多的线条要在一个图上显示,会遮挡数据。(更不用说如果显示图例,它会覆盖一半的图形)。 我尝试通过for循环运行未堆叠的groupby,但似乎无法使其正常工作。 - A. Chatfield
再次感谢,但问题是我想绘制的线条太多了,当将它们作为单个图的子图绘制时,垂直压缩到完全无法阅读的程度。理想情况下,我希望每条线都绘制为单独的图,并保存到单独的文件路径中。为此,我尝试使用for循环: `afplot = apple_fplot.unstack('Domain Category')for i, column in afplot: plt.figure(i);afplot[column].plot() plt.savefig('.../apple fplot{}'.format(i))`我不确定这是否可行,但它给了我一个错误: ValueError: too many values to unpack - A. Chatfield

11

您可以做:

import matplotlib
matplotlib.style.use('ggplot')
import matplotlib.pyplot as plt

plt.figure()
df.groupby(['Year','Fungicide']).sum().unstack().plot()

enter image description here

数据

   Year        State Fungicide  Value
0  2011   California         A  12879
1  2011   California         B  29572
2  2011      Florida         A   8645
3  2011      Florida         B  19573
4  2009   California         A   8764
5  2009   California         B  98643

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接