Pandas数据框错误栏图按类别分隔

时间:2017-08-29 17:28:47

标签: python pandas matplotlib seaborn errorbar

所以我尝试了seabornpandas本机绘图功能,感觉我已经降级为使用纯matplotlib,这令人失望,但这是我目前遇到的问题。

我有一个pandas数据框,其中包含时间上的x值,幅度中的y值以及名为不确定性的列中的自定义错误值。我还有一个名为Filters的列。对于每个滤波器,我想基本上绘制一个误差条图,其中 x =时间,y =幅度,yerr =不确定性。这是一个示例数据(因为真实数据是专有的):

Image   Filter    Time  Magnitude   Uncertainty
File1   1 micron    0   12.1    0.008
File2   1.5 micron  0   13.4    0.01
File3   1 micron    1   12.9    0.01
File4   1.5 micron  1   13.8    0.013
File5   1 micron    2   14.2    0.014
File6   1.5 micron  2   14.66   0.0155
File7   1 micron    3   15.12   0.017
File8   1.5 micron  3   15.58   0.0185
File9   1 micron    4   16.04   0.02
File10  1.5 micron  4   16.5    0.0215
File11  1 micron    5   16.96   0.023
File12  1.5 micron  5   17.42   0.0245
File13  1 micron    6   17.88   0.026
File14  1.5 micron  6   18.34   0.0275
File15  1 micron    7   18.8    0.029
File16  1.5 micron  7   19.26   0.0305
File17  1 micron    8   19.72   0.032
File18  1.5 micron  8   20.18   0.0335
File19  1 micron    9   20.64   0.035
File20  1.5 micron  9   21.1    0.0365

因此,在单个图上,我想要一系列带有错误栏(基于不确定性列)的点,对应于该过滤器(1微米或1.5微米)。

如果我在seaborn中执行此操作,我会收到以下信息:

Seaborn's attempt at doing a plot

我无法使用errorbar执行地图(如上面一行中所述),因为它声称:

  

“ValueError:yerr必须是标量,与y或2xN的尺寸相同。”

如果我直接在pandas尝试此操作,我会收到以下信息:

Pandas attempt at doing this

这些都不是我想要的。我认为pandasseaborn应该可以缓解所有这些问题,并且可以更轻松,更轻松地完成这类工作,而不必像将其读入numpy genfromtxt那样做一些人为的废话,排序通过过滤器等

1 个答案:

答案 0 :(得分:0)

这实现了你想要的目标:

g = sns.FacetGrid(data=df, hue='Filter')
g.map(plt.errorbar, 'Time', 'Magnitude', 'Uncertainty', fmt='o', elinewidth=1, capsize=5, capthick=1)
g.add_legend()

enter image description here

@FabienP在评论中说,你的问题可能只是你的错误栏太小而无法看到。你的意思是绘制yerr=Magnitude*Uncertainty