首页 > 解决方案 > Seaborn条形图中的误差条颜色与色调

问题描述

我绘制seaborn.barplothue几个类别。

我希望错误栏与栏本身具有相同的颜色线 - 我该怎么做?

我用这样的数据框来称呼它,我有四个房屋类别:

sns.barplot(y = '$T_i$', x = 'algo', hue = 'pricing', data = df, alpha = 0.0, ci = 100, capsize = 0.1)

errcolor = 'black'在 kwargs 中找到了,但它改变了所有酒吧,不管色调如何。

在此处输入图像描述

标签: pythonmatplotlibseabornbar-chart

解决方案


这是一种令人不快的方法,但似乎有效。您可以访问条形图 ( ax.patches[x].get_facecolor()) 中矩形的颜色,并使用这些颜色为误差线 ( ) 分配新颜色ax.get_lines()[x].set_color()。这是使用示例的seaborn示例:

import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.barplot(x="day", y="total_bill", data=tips,)

patches = ax.patches
lines_per_err = 3

for i, line in enumerate(ax.get_lines()):
    newcolor = patches[i // lines_per_err].get_facecolor()
    line.set_color(newcolor)

结果图:

在此处输入图像描述

这个解决方案有几个问题:

  • 您必须使用这些不太友好getset命令matplotlib
  • 有一个假设,ax.patches并且ax.get_lines()正在以一致的顺序返回,比如从左到右(或多或少)。请注意,我的图中实际上有 12 个线对象(4 *(误差条 + 底盖 + 顶盖)),并且只有 4 个图形条。请注意这一点,因为您的图表有更多条形(即我不确定这个假设是否成立)。您可以尝试通过对对象应用排序来更明确(如sorted(ax.patches, key=lambda x: x.get_x()sorted(ax.get_lines(), key=lambda x:x.get_xdata()[0]))。
  • 如果绘图中有其他线或矩形几何图形,您可能不希望以它们为目标。因此,您可能必须在创建条形图和误差线之后,但在其他事情之前运行它。seaborn对于某些在一个函数调用中绘制大量内容的绘图,这可能是不可能的。
  • 显然这比某种errcolor参数更麻烦,但我没有从情节调用中看到这样做的选项。但在紧要关头,上述内容可能就足够了。

编辑:我将线条链接到补丁的原始逻辑不正确。如上所示,您可以使用i // lines_per_error将误差线连接到图表栏。这lines_per_error是绘制每个误差线的行数。由于我认为它应该只有 1 或 3,具体取决于您是否使用错误栏上限,您可以执行以下操作:

capsize = None

ax = sns.barplot(..., capsize=capsize)

lines_per_err = 1 if capsize is None else 3

此外,这是一个使用 a 的示例hue

import seaborn as sns

capsize = .1

tips = sns.load_dataset("tips")
ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips, capsize=capsize)

patches = ax.patches
lines_per_err = 1 if capsize is None else 3

for i, line in enumerate(ax.get_lines()):
    newcolor = patches[i // lines_per_err].get_facecolor()
    line.set_color(newcolor)

在此处输入图像描述


推荐阅读