如何自定义Seaborn Barplot中hue参数生成的分类配色
解决方法
你之前使用color参数无法实现需求的原因是:该参数仅用于设置统一的基础色调,Seaborn会基于该颜色自动生成同色系明暗渐变,不支持传入多色列表匹配hue的多个分类。要自定义hue对应的分类配色,需要使用palette参数。
具体实现步骤:
- 定义和hue分类顺序匹配的颜色列表,你的status分类顺序是
["Early", "On Time", "Overdue", "Long Overdue"],对应你要的蓝、绿、黄、红顺序,可直接使用如下颜色列表(也可以替换为你需要的具体色值,支持颜色名、十六进制、RGB元组等格式):
custom_palette = ["#165DFF", "#00B42A", "#FFDD00", "#F53F3F"]
- 在调用
sns.barplot时传入palette=custom_palette参数即可。
修改后完整运行代码
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd.DataFrame({'Early': {'A': 686, 'B': 533, 'C': 833, 'D': 625, 'E': 820}, 'Long Overdue': {'A': 203, 'B': 237, 'C': 436, 'D': 458, 'E': 408}, 'On Time': {'A': 881, 'B': 903, 'C': 100, 'D': 53, 'E': 50}, 'Overdue': {'A': 412, 'B': 509, 'C': 813, 'D': 1046, 'E': 904}}) df_long = df.unstack().to_frame(name='value') df_long = df_long.swaplevel() df_long.reset_index(inplace=True) df_long.columns = ['group', 'status', 'value'] df_long['status'] = pd.Categorical(df_long['status'], ["Early", "On Time", "Overdue", "Long Overdue"]) df_long = df_long.sort_values("status") fig, ax = plt.subplots(figsize=(18.5, 10.5)) # 新增自定义配色、传入palette参数 custom_palette = ["#165DFF", "#00B42A", "#FFDD00", "#F53F3F"] g = sns.barplot(data=df_long, x='group', y='value', hue='status', palette=custom_palette, ax=ax) for bar in g.patches: height = bar.get_height() ax.text(bar.get_x() + bar.get_width() / 2., 0.5 * height, int(height), ha='center', va='center', color='white') plt.xticks(fontsize=12) plt.legend(loc='upper left', prop={'size': 14}) ax.xaxis.label.set_visible(False) ax.axes.get_yaxis().set_visible(False) plt.show()
内容的提问来源于stack exchange,提问作者The Singularity
相关产品推荐
相关产品推荐

