Seaborn 因子图自定义误差线

Posted

技术标签:

【中文标题】Seaborn 因子图自定义误差线【英文标题】:Seaborn factor plot custom error bars 【发布时间】:2015-08-03 20:14:40 【问题描述】:

我想在 seaborn 中绘制因子图,但手动提供误差线,而不是让 seaborn 计算它们。

我有一个大致如下所示的 pandas 数据框:

     model output feature  mean   std
0    first    two       a  9.00  2.00
1    first    one       b  0.00  0.00
2    first    one       c  0.00  0.00
3    first    two       d  0.60  0.05
...
77   third   four       a  0.30  0.02
78   third   four       b  0.30  0.02
79   third   four       c  0.10  0.01

我正在输出一个大致如下所示的图:

我正在使用这个 seaborn 命令来生成情节:

g = sns.factorplot(data=pltdf, x='feature', y='mean', kind='bar',
                   col='output', col_wrap=2, sharey=False, hue='model')
g.set_xticklabels(rotation=90)

但是,我不知道如何让 seaborn 使用“std”列作为误差线。不幸的是,重新计算相关数据帧的输出会非常耗时。

这有点类似于这个q: Plotting errors bars from dataframe using Seaborn FacetGrid

除了我不知道如何让它与 matplotlib.pyplot.bar 函数一起工作。

有没有办法将 seaborn factorplotFacetGrid 与 matplotlib 结合使用?

谢谢!

【问题讨论】:

我认为链接问题将是最好的方法。 plt.bar 有一个 yerr 参数应该会有所帮助。 谢谢@mwaskom,关于如何让它运行的任何提示?目前以下代码阻塞:g = sns.FacetGrid(data=pltdf, col='output', col_wrap=6, sharey=False, hue='model') g.map(plt.bar, 'feature', 'mean', yerr='std') 为混乱的代码道歉,似乎无法在评论部分很好地格式化。 我认为问题在于 bar 中的 yerr 参数不是位置参数,而是 kwarg。 请参阅rules 了解可映射的功能。您需要在 plt.bar 周围编写一个瘦包装器,它接受 yerr 作为位置参数。 【参考方案1】:

python 3.8.12pandas 1.3.4matplotlib 3.4.3seaborn 0.11.2 中测试

你可以这样做

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")

tip_sumstats = (tips.groupby(["day", "sex", "smoker"])
                     .total_bill
                     .agg(["mean", 'sem'])
                     .reset_index())

def errplot(x, y, yerr, **kwargs):
    ax = plt.gca()
    data = kwargs.pop("data")
    data.plot(x=x, y=y, yerr=yerr, kind="bar", ax=ax, **kwargs)

g = sns.FacetGrid(tip_sumstats, col="sex", row="smoker")
g.map_dataframe(errplot, "day", "mean", "sem")

【讨论】:

Stellar,非常感谢@mwaskom 的帮助,以及你整理的可爱的包裹。它真的非常有用。 p = sns.catplot(kind='bar', data=tips, col="sex", row="smoker", x='day', y='total_bill', ci=68, height=3) 使用 catplot 似乎相同【参考方案2】:

这是另一种方法:

import matplotlib.pyplot as plt
import numpy as np

plt.plot(np.asarray([[0, 0], [1, 1]]).T, np.asarray([[0.3, 0.4], [0.01 , 0.02]]).T)
plt.show()

x 值对应条形图的分类值(0 是第一个类别,依此类推)。 y 值显示误差线的上限和下限。两个数组都必须转置以使 matplotlib 正确显示它们。我只是发现这种方式更具可读性。

【讨论】:

以上是关于Seaborn 因子图自定义误差线的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn 调色板不适用于线图

python可视化自定义设置坐标轴的范围自定义设置主坐标轴刻度和次坐标轴刻度自定义坐标轴刻度的显示样式自定义坐标轴刻度数值的颜色以及小数点位数添加坐标轴刻度网格线自定义移动坐标轴的位置

谷歌柱形图自定义图例

弹性柱形图自定义

如何更改seaborn中因子图的顺序

R语言ggplot2可视化为复杂图自定义图例手动构造图例(legend)实战