如何在 seaborn 图形级图中指定调色板
How to specify the palette in a seaborn figure-level plot
如果我需要进行特定更改或面向细节的可视化,我已经学会了不使用 seaborn,但我觉得我有时没有充分利用它所提供的功能。
- 我有一系列绘制集群成员资格的二维切片。
- 问题在于案例之间,存在的集群数量发生变化,导致 seaborn 在每个案例中重置调色板,导致不同集群使用相同的颜色。
我想专门为 seaborn 指定调色板。我不确定我是否只是遗漏了什么,或者这是使用 facetgrid 时无法解决的细节?
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']
for layer in df['K'].unique():
layer_data_slice = df.groupby('K').get_group(layer)
g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard")
g.map_dataframe(sns.scatterplot, x="I", y="J", s=50, marker='+', palette='deep')
g.add_legend()
g.fig.suptitle("Training Realizations, Layer: {}".format(int(layer)), size=16, y=1.05)
figure_title = 'Training_Layer_{}'.format(int(layer))
我尝试将以下内容用于调色板定义,但它不会影响绘图:
palette = {0:"tab:cyan", 1:"tab:orange", 2:"tab:purple"}
已尝试使用“tab:color”、“color”和 RGB 参考,但没有成功。没有错误,它在更改时根本不执行任何操作。
- 更新至 seaborn 0.11.2。使用
FacetGrid
directly is not recommended. Use seaborn.relplot
和 kind='scatter'
绘制 figure-level 图。
palette
中的 keys
必须与传递给 hue
. 的列中的唯一值匹配
- 在
python 3.8.12
、pandas 1.3.4
、matplotlib 3.4.3
、seaborn 0.11.2
中测试
import seaborn as sns
# load the data - this is a pandas.DataFrame
tips = sns.load_dataset('tips')
# set the hue palette as a dict for custom mapping
palette = {'Lunch': "tab:cyan", 'Dinner':"tab:purple"}
# plot
p = sns.relplot(kind='scatter', data=tips, col='smoker', x='total_bill', y='tip', hue='time', palette=palette)
- 使用添加到 OP 的新样本数据
- 如果
'K'
列重命名为 'Layer'
,则子图标题将与您的示例匹配:df = df.rename({'K': 'Layer'}, axis=1)
p = sns.relplot(data=df, x='I', y='J', s=50, marker='+', row='Layer', col='Realization', hue='CM_Hard', palette=palette, height=4)
p.fig.suptitle('Training Realizations', y=1.05, size=16)
FacetGrid
- 请注意
palette
在 FacetGrid
调用中,而不是 map_dataframe
for layer in df['K'].unique():
layer_data_slice = df.groupby('K').get_group(layer)
g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard", palette=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))
如果我需要进行特定更改或面向细节的可视化,我已经学会了不使用 seaborn,但我觉得我有时没有充分利用它所提供的功能。
- 我有一系列绘制集群成员资格的二维切片。
- 问题在于案例之间,存在的集群数量发生变化,导致 seaborn 在每个案例中重置调色板,导致不同集群使用相同的颜色。
我想专门为 seaborn 指定调色板。我不确定我是否只是遗漏了什么,或者这是使用 facetgrid 时无法解决的细节?
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']
for layer in df['K'].unique():
layer_data_slice = df.groupby('K').get_group(layer)
g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard")
g.map_dataframe(sns.scatterplot, x="I", y="J", s=50, marker='+', palette='deep')
g.add_legend()
g.fig.suptitle("Training Realizations, Layer: {}".format(int(layer)), size=16, y=1.05)
figure_title = 'Training_Layer_{}'.format(int(layer))
我尝试将以下内容用于调色板定义,但它不会影响绘图:
palette = {0:"tab:cyan", 1:"tab:orange", 2:"tab:purple"}
已尝试使用“tab:color”、“color”和 RGB 参考,但没有成功。没有错误,它在更改时根本不执行任何操作。
- 更新至 seaborn 0.11.2。使用
FacetGrid
directly is not recommended. Useseaborn.relplot
和kind='scatter'
绘制 figure-level 图。 palette
中的keys
必须与传递给hue
. 的列中的唯一值匹配
- 在
python 3.8.12
、pandas 1.3.4
、matplotlib 3.4.3
、seaborn 0.11.2
中测试
import seaborn as sns
# load the data - this is a pandas.DataFrame
tips = sns.load_dataset('tips')
# set the hue palette as a dict for custom mapping
palette = {'Lunch': "tab:cyan", 'Dinner':"tab:purple"}
# plot
p = sns.relplot(kind='scatter', data=tips, col='smoker', x='total_bill', y='tip', hue='time', palette=palette)
- 使用添加到 OP 的新样本数据
- 如果
'K'
列重命名为'Layer'
,则子图标题将与您的示例匹配:df = df.rename({'K': 'Layer'}, axis=1)
p = sns.relplot(data=df, x='I', y='J', s=50, marker='+', row='Layer', col='Realization', hue='CM_Hard', palette=palette, height=4)
p.fig.suptitle('Training Realizations', y=1.05, size=16)
FacetGrid
- 请注意
palette
在FacetGrid
调用中,而不是map_dataframe
for layer in df['K'].unique():
layer_data_slice = df.groupby('K').get_group(layer)
g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard", palette=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))