基于 DataFrame 列名称的彩色 seaborn 箱线图
Color seaborn boxplot based in DataFrame column name
我想创建一个箱线图列表,其框的颜色取决于我用作输入的 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()
这确实制作了不同颜色的箱线图,但所有箱线图都在彼此之上并且没有正确的标签。如果我能以某种方式将这些箱线图很好地放在彼此下方的一个图中,我几乎可以达到我想要的效果。或者有更好的方法吗?
您可以在一次性绘制完各个框后设置它们的面色,使用 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()
您应该使用处理多种颜色的 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)
我想创建一个箱线图列表,其框的颜色取决于我用作输入的 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()
这确实制作了不同颜色的箱线图,但所有箱线图都在彼此之上并且没有正确的标签。如果我能以某种方式将这些箱线图很好地放在彼此下方的一个图中,我几乎可以达到我想要的效果。或者有更好的方法吗?
您可以在一次性绘制完各个框后设置它们的面色,使用 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()
您应该使用处理多种颜色的 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)