基于DataFrame列名的颜色seaborn箱线图

11

我想创建一个箱线图列表,箱子的颜色取决于我用作输入的pandas.DataFrame列的名称。

列名包含指示基于哪个实验条件的字符串,我希望箱子的颜色能基于这些字符串而变化。

我这样做来制作箱线图:

sns.boxplot(data = data.dropna(), orient="h")
plt.show()

这将创建一个带有正确名称的漂亮的箱线图列表。现在,我想给所有名称中包含“prog +,DMSO +”的箱线图涂成红色,其余部分保持蓝色。

我尝试创建一个以列名为键,颜色为值的字典:


我尝试使用列名作为键来创建一个以颜色为值的字典:
color = {}
for column in data.columns:
    if 'prog+, DMSO+' in column:
        color[column] = 'red'
    else:
        color[column] = 'blue'

然后将字典用作颜色:

sns.boxplot(data = data.dropna(), orient="h", color=color[column])
plt.show()

可以理解为,这并不起作用(因为没有循环遍历字典)。所以我创建了一个循环:

for column in data.columns:
    sns.boxplot(data = data[column], orient='h', color=color[column])
plt.show()

这样做可以生成不同颜色的箱线图,但是它们会全部叠在一起,而且没有正确的标签。如果我能够将这些箱线图整齐地放在一个图下面,那么我就接近我想要的结果了。或者有更好的方法吗?


你需要将你的字典传递给 palette(多种颜色),而不是 color(单一颜色)。 - mwaskom
2个回答

16
你应该使用 palette 参数来处理多种颜色,而不是 color 参数来处理单个颜色。你可以给 palette 一个名称、一个有序列表或一个字典。后者似乎最适合你的问题:
import seaborn as sns
sns.set_color_codes()
tips = sns.load_dataset("tips")
pal = {day: "r" if day == "Sat" else "b" for day in tips.day.unique()}
sns.boxplot(x="day", y="total_bill", data=tips, palette=pal)

在这里输入图片描述


如何添加图例? - user147529

9
您可以在一次绘制所有盒子之后,设置每个盒子的面颜色,使用ax.artists[i].set_facecolor('r') 例如:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(
        [[2, 4, 5, 6, 1],
         [4, 5, 6, 7, 2],
         [5, 4, 5, 5, 1],
         [10, 4, 7, 8, 2],
         [9, 3, 4, 6, 2],
         [3, 3, 4, 4, 1]
        ],columns=['bar', 'prog +, DMSO+ 1', 'foo', 'something', 'prog +, DMSO+ 2'])

ax = sns.boxplot(data=df,orient='h')

boxes = ax.artists

for i,box in enumerate(boxes):
    if 'prog +, DMSO+' in df.columns[i]:
        box.set_facecolor('r')
    else:
        box.set_facecolor('b')

plt.tight_layout()
plt.show()

enter image description here


这是一个聪明的解决方案,但不必要地复杂。 - mwaskom
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - MaxG

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