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

Posted

技术标签:

【中文标题】基于 DataFrame 列名的颜色 seaborn 箱线图【英文标题】:Color seaborn boxplot based in DataFrame column name 【发布时间】:2016-02-06 07:24:09 【问题描述】:

我想创建一个箱线图列表,箱线图的颜色取决于我用作输入的 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(一种颜色)。 【参考方案1】:

您应该使用处理多种颜色的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)

【讨论】:

如何添加图例?【参考方案2】:

您可以使用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()

【讨论】:

这是一个聪明的解决方案,但不必要地复杂。 (+1) 这是迄今为止我发现的使用 seaborn 处理分组箱线图中各个颜色的唯一方法

以上是关于基于 DataFrame 列名的颜色 seaborn 箱线图的主要内容,如果未能解决你的问题,请参考以下文章

R语言rename重命名dataframe的列名实战:rename重命名dataframe的列名(写错的列名不会被重命名)

R语言修改dataframe的列名(column name)实战

基于列名的带有图例的 T-SNE 散点图

python 修改dataframe的列名

基于列索引的 Spark Dataframe 选择

DataFrame[]中括号,通过列名取数据