如何在seaborn figure-level绘图中指定调色板解决同色对应不同簇问题
Seaborn自定义调色板不生效解决方案
你的自定义调色板不生效,核心是参数传递位置错误:hue参数是在FacetGrid初始化时指定的,此时调色板规则由FacetGrid控制,你把palette传给内部的scatterplot不会生效。另外要实现不同切片的簇颜色完全对应,还需要固定hue_order,避免某类簇缺失时调色板自动重置顺序。
修改方法如下:
- 提前定义固定调色板和固定的hue取值顺序
- 初始化
FacetGrid时传入palette和hue_order参数
修改后的代码示例:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame() df['I'] = np.full(20,1) df['J'] = np.arange(0,20,1) df['K'] = [1]*12 + [2]*8 df['CM_Hard'] = [1]*10 + [2] + [0] + [2]*8 df['Realization'] = ['p25']*10 + ['p50']*9 + ['p75'] # 提前定义固定调色板和hue顺序 palette = {0:"tab:cyan", 1:"tab:orange", 2:"tab:purple"} hue_order = [0,1,2] # 固定所有切片的hue取值顺序,即使某类不存在也不会乱序 for layer in df['K'].unique(): layer_data_slice = df.groupby('K').get_group(layer) # 把palette和hue_order传给FacetGrid g = sns.FacetGrid(layer_data_slice, col="Realization", hue="CM_Hard", palette=palette, hue_order=hue_order) # 内部scatterplot不需要再传palette g.map_dataframe(sns.scatterplot, x="I", y="J", s=50, marker='+') g.add_legend() g.fig.suptitle("Training Realizations, Layer: {}".format(int(layer)), size=16, y=1.05) figure_title = 'Training_Layer_{}'.format(int(layer)) plt.show() # 按需保留用于显示图片
以上修改可以保证不同切片中同一个簇的颜色完全一致,即使某个切片中不存在某类簇,也不会出现颜色对应错位的问题。
内容的提问来源于stack exchange,提问作者Jaynkumz
相关产品推荐
相关产品推荐

