如何使用matplotlib为分组条形图添加误差条?

tkqqtvp1  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(127)

我目前正在分析一个野外实验中收集的蚯蚓数量数据。我的变量是网站的风格(实验网站与参考地点)、收集数据的年份、栽培的作物和蚯蚓的数量。我使用groupby()将蚯蚓按类型、年份和作物分组,并将其显示在条形图中。
但是当我试图添加相应的标准偏差时,它给了我以下错误:
ValueError:'yerr'(shape:(8,))必须是标量或1D或(2,n)类数组,其形状匹配'y'(形状:(4,))
我不能解决这个问题,我对Python(和stackoverflow)还很陌生。任何提示将不胜感激!
下面是我的代码:

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

data = {'Style': ["Experiment","Reference", "Experiment", "Reference", "Experiment","Reference",
                  "Experiment", "Reference"],
        'Year': ["2021", "2021","2022","2022", "2021","2021", "2022", "2022"],
        'Crop': ["Rapeseed", "Rapeseed", "Rapeseed", "Rapeseed",
                 "Maize", "Maize", "Maize", "Maize"],
        'Earthworms': [55, 2, 2,6,0,1,7,22]
       }

df = pd.DataFrame(data)

#Set graph properties
fig, ax = plt.subplots(figsize=(15,7))
colors = {"Maize": "#de8f05", "Rapeseed":"#d7bb19"}         
labels = list(colors.keys())

#Create yerr variable
yerr = [10.6926766215636, 1.4142135623731, 0.577350269189626,1.414213562, 0,
        0.707106781186548, 2.857738033, 4.43471156521669]

#Groupby Year, Patchstyle, Crop (ind. variables), EW_num (dep. variable)
df = df.groupby(["Year", "Style", "Crop"])["Earthworms"].sum().unstack().plot.bar(ax=ax, color=colors,     yerr=yerr)

#Assign labels, axis ticks + limit, hide spines  

plt.ylabel("N", size=13, labelpad=10)
plt.yticks(fontsize=12)
plt.xticks(fontsize=12)
ax.set(xlabel=None)

plt.ylim(0,60)    
ax.spines.right.set_visible(False)
ax.spines.top.set_visible(False)
ax.margins(0.2,0)

字符串

mzaanser

mzaanser1#

正如错误所说,问题在于yerr的形状。打印前查看数据框操作的结果:

print(df.groupby(["Year", "Style", "Crop"])["Earthworms"].sum().unstack())

Crop             Maize  Rapeseed
Year Style                      
2021 Experiment      0        55
     Reference       1         2
2022 Experiment      7         2
     Reference      22         6

字符串
所以,我们每年有2个酒吧/风格组合(因为有两种作物)。因此,pandas希望将单个yerr值应用于所有条形图,或者为每个条形图应用一个特定的yerr,但这需要在(2,4)中进行整形(如错误消息所建议的)
我不知道哪个错误对应于哪个条形图,但是对yerr = np.array(yerr).reshape(2,4)进行简单的整形并运行代码会产生一个没有错误的图。我将把它留给您来弄清楚如何创建yerr,以便正确的错误出现在正确的条形图中。(尽管我会补充一点,当像这样重新整形时,前4个值会转到第一行,接下来的4个值会转到第二行。基于0位于第5个点,并且第一个黄色条没有误差条,似乎表明它将第一行应用于一个作物,然后将下一行应用于下一个作物。)
x1c 0d1x的数据

相关问题