seaborn swarmplot省略x/y时hue不生效,如何按指定列给点自定义配色
seaborn swarmplot自定义点配色解决方案
最优方案(保留原生蜂群排列效果)
你只需要给x参数传入固定常量,让所有数据属于同一个分组,即可在使用hue+palette实现自定义配色的同时,保留蜂群堆叠效果:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 原始数据 data = {'name': ['A', 'B', 'C', 'D'], 'score': [-9.5, -8.3, -8.1, -7.0], 'color': [4, 3, 2, 1]} df = pd.DataFrame(data) colors = {1:'pink', 2:'orange', 3:'red', 4:'green'} # 绘图代码 ax = sns.swarmplot(data=df, x=0, # 固定x分组,所有点在同一列排列 y='score', s=10, hue='color', palette=colors) # 可选:隐藏不需要的x轴元素和图例 ax.set(xlabel='', xticks=[]) ax.get_legend().remove() plt.show()
替代方案(手动修改点颜色)
如果不想使用hue参数,也可以在绘图完成后直接修改底层matplotlib对象的颜色属性:
ax = sns.swarmplot(data=df, y='score', s=10) # 批量设置点的填充色 ax.collections[0].set_facecolor([colors[val] for val in df['color']]) plt.show()
之前方案失效原因说明
c是matplotlib原生散点图的参数,seaborn swarmplot不直接识别该参数,因此传值后不会生效palette参数需要和hue参数配合使用才能完成颜色和数据的匹配,单独传palette会默认取色板最后一个颜色给所有点- 之前设置
x='Title'时,每个x分类下仅有1个数据点,不会触发蜂群堆叠逻辑,因此看起来和普通散点效果一致
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

