如何为Seaborn Factorplot设置独立条形颜色?custom_palette无效
解决Seaborn Factorplot(Catplot)设置单个条形颜色的问题
首先提一句:Seaborn的factorplot已经被catplot取代啦,现在官方更推荐使用catplot(功能完全一致,只是命名更规范),下面的示例我会用catplot来演示,你直接替换成factorplot也能正常运行。
你遇到的所有条形显示同一种颜色的问题,大概率是因为palette参数默认是和hue变量的类别绑定的——如果没有指定hue,或者hue只有一个类别,那么Seaborn只会用你传入的custom_palette里的第一个颜色来渲染所有条形。下面分两种常见场景给你解决方案:
场景1:修改单组条形中的某一个颜色
如果你的图是单组条形(比如x轴是多个类别,但没有hue分组),想单独修改某一个条形的颜色,你可以先画出图表,然后直接获取条形对应的patch对象来修改:
import seaborn as sns import matplotlib.pyplot as plt # 用Seaborn自带的示例数据 tips = sns.load_dataset("tips") # 绘制条形图(kind="bar"对应factorplot的bar类型) g = sns.catplot(x="day", y="total_bill", kind="bar", data=tips) # 获取图表的axes对象(catplot返回的是FacetGrid,需要从里面取出axes) ax = g.axes[0][0] # 修改第二个条形的颜色(索引从0开始,这里把周五的条形改成橙红色) ax.patches[1].set_facecolor("#ff4500") # 如果要改边框颜色,可以用set_edgecolor # ax.patches[1].set_edgecolor("#000000") plt.show()
场景2:给每个条形分配自定义颜色
如果想让每个x轴类别对应不同的自定义颜色,你可以把custom_palette做成字典形式,键是x轴的类别名称,值是对应的颜色代码,然后传给palette参数:
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") # 自定义颜色字典,每个x类别对应一个颜色 custom_palette = { "Thur": "#87ceeb", "Fri": "#ff6347", "Sat": "#32cd32", "Sun": "#ffd700" } # 直接把字典传给palette,Seaborn会自动匹配x的类别 g = sns.catplot(x="day", y="total_bill", kind="bar", data=tips, palette=custom_palette) plt.show()
如果你的custom_palette是列表形式,只要列表长度和x轴的类别数量一致,也能正常生效:
custom_palette = ["#87ceeb", "#ff6347", "#32cd32", "#ffd700"] g = sns.catplot(x="day", y="total_bill", kind="bar", data=tips, palette=custom_palette)
为什么之前的custom_palette没生效?
如果你的custom_palette是列表,但所有条形同色,大概率是因为:
- 你的x轴只有1个类别,或者hue变量只有1个水平,Seaborn只会取列表的第一个颜色;
- 列表长度和x/hue的类别数量不匹配,Seaborn会循环使用列表里的颜色,但如果列表长度为1,就会所有条形同色。
内容的提问来源于stack exchange,提问作者user8255008
相关产品推荐
相关产品推荐

