如何为Seaborn pairplot设置渐变颜色与可变标记大小
解决方案
你可以直接使用seaborn.PairGrid自定义非对角线绘图逻辑实现需求,不需要手动遍历列生成子图,逻辑更简洁,适配性也更强,不用依赖修改pairplot生成后的画布元素。
完整实现代码如下:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np from matplotlib.colors import LinearSegmentedColormap # 生成测试数据 np.random.seed(1) a = np.arange(0, 10, 0.1) def myFunc(x): return 10 + 10*x -x**2 + 1*np.random.random(x.shape[0]) b = myFunc(a) c = a * np.sin(a) df = pd.DataFrame({'a': a, 'b': b, 'c': c}) # 自定义颜色映射:低黄高蓝 cmap = LinearSegmentedColormap.from_list('yellow_blue', ['gold', 'lightblue', 'darkblue']) # 标记大小缩放系数,可根据实际显示效果调整 size_scale = 2 # 初始化PairGrid,开启corner模式只画下三角 g = sns.PairGrid(df, corner=True) # 对角线画直方图,颜色统一为灰色 g.map_diag(plt.hist, color=".6") # 非对角线自定义散点图,颜色映射a列,大小映射b列 def scatter_custom(x, y, **kwargs): plt.scatter(x, y, c=df['a'], cmap=cmap, s=df['b']*size_scale, alpha=0.7) g.map_offdiag(scatter_custom) # 可选:添加颜色条说明颜色对应a列数值 sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=df['a'].min(), vmax=df['a'].max())) sm.set_array([]) g.figure.colorbar(sm, ax=g.axes, shrink=0.8, label='a value') plt.show()
方案说明
- 用
PairGrid替代直接调用pairplot,可以自由定义不同位置子图的绘图逻辑,避免后续遍历修改画布元素的兼容性问题 - 非对角线统一调用自定义的散点函数,一次性实现颜色按
a列渐变、大小按b列缩放的需求,所有非对角子图自动生效 - 可以根据需求调整
size_scale参数控制标记大小范围,调整alpha参数避免点重叠看不清 - 代码兼容seaborn所有主流版本,不会因为seaborn升级导致pairplot内部结构变化后遍历修改失效的问题
效果示意图:

内容的提问来源于stack exchange,提问作者user733733
相关产品推荐
相关产品推荐

