基于DataFrame列名称

时间:2015-11-05 12:45:17

标签: python python-3.x pandas matplotlib seaborn

我想创建一个箱形图列表,其颜色取决于我用作输入的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()

这确实制作了不同颜色的箱形图,但它们彼此重叠并且没有正确的标签。如果我能以某种方式将这些箱形图很好地放在彼此之下的一个图中,那么我几乎就是我想要的。或者有更好的方法吗?

2 个答案:

答案 0 :(得分:10)

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

enter image description here

答案 1 :(得分:8)

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