如何为Seaborn pairplot中的特定标记添加黑色边框
为Seaborn Pairplot中指定标记添加黑色边框
原始代码
import seaborn as sns import pandas as pd import numpy as np Data = pd.DataFrame(columns=['x1','x2','x3','label']) for i in range(100): Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'1'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'2'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'3'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'4'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'5'] sns.pairplot(Data,vars=['x1','x2','x3'],hue='label',markers=['o','s','s','s','s'],corner=True)
问题描述
上述代码生成带corner=True的Seaborn Pairplot,其中label为'1'的样本用圆形标记(o),label为'2'-'5'的样本用方形标记(s)。需要仅为方形标记添加黑色边框提升辨识度,但两种尝试均失败:
- 添加
grid_kws={fillstyles:['none','full','full','full','full']}触发NameError,一是fillstyles未加引号,二是grid_kws用于配置网格样式而非标记填充; - 添加
plot_kws={'edgecolor':'black'}后所有标记都被加上黑边框,因为plot_kws是全局参数,会作用于所有hue分组。
解决方案
通过PairGrid对象获取各hue分组的散点集合,针对方形标记单独设置边框样式:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt Data = pd.DataFrame(columns=['x1','x2','x3','label']) for i in range(100): Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'1'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'2'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'3'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'4'] Data.loc[len(Data.index)] = [np.random.rand(),np.random.rand(),np.random.rand(),'5'] # 生成pairplot并保存返回的PairGrid对象 g = sns.pairplot(Data,vars=['x1','x2','x3'],hue='label',markers=['o','s','s','s','s'],corner=True) # 遍历每个hue分组,筛选方形标记对应的分组 for idx in range(len(g.markers)): if g.markers[idx] == 's': # 遍历所有子图,为目标分组设置黑色边框 for ax in g.axes.flat: if ax is not None: scatters = ax.collections[idx] scatters.set_edgecolor('black') scatters.set_linewidth(1.5) # 可选,调整边框粗细 plt.show()
原理说明
- Seaborn的Pairplot返回
PairGrid对象,每个hue分组对应一个独立的散点集合,存储在子图的collections列表中; - 通过
g.markers可获取每个分组的标记类型,据此筛选需要添加边框的方形标记分组; - 遍历所有子图,为目标分组的散点集合单独设置
edgecolor和linewidth参数,实现仅方形标记加黑边框的效果。
内容的提问来源于stack exchange,提问作者Kaynar
相关产品推荐
相关产品推荐

