Seaborn绘图添加连续colorbar并设置色阶以0为中心的方法咨询
解决方案
实现色图以0为中心可使用matplotlib自带的TwoSlopeNorm(发散型归一化类),同时需同步对齐seaborn散点图和colorbar的归一化规则,避免散点颜色与色阶不匹配。
完整修改后代码
import numpy as np import seaborn as sns import matplotlib.pyplot as plt y = np.random.normal(30,30,100) x = np.random.uniform(0,50,100) # 计算对称色阶范围,保证关于0对齐 vlim = np.abs(y).max() # 创建以0为中心的发散归一化对象 norm = plt.TwoSlopeNorm(vcenter=0, vmin=-vlim, vmax=vlim) # 若要固定色阶范围为-80~80,直接替换为下行即可 # norm = plt.TwoSlopeNorm(vcenter=0, vmin=-80, vmax=80) s = sns.scatterplot( y=y, x=x, hue=y, size=y, palette='RdBu', sizes=(50,50), hue_norm=norm # 同步散点的颜色归一化规则 ) sm = plt.cm.ScalarMappable(cmap="RdBu", norm=norm) sm.set_array([]) s.get_legend().remove() s.figure.colorbar(sm) plt.show()
修改说明
- 替换默认的
Normalize为TwoSlopeNorm,指定vcenter=0强制色图中心对齐0值,此时0值刚好对应RdBu色卡的中间白色 - 动态计算对称的色阶范围
vlim = np.abs(y).max(),生成关于0对称的vmin、vmax,符合可接受扩展色阶区间的需求 - 给
scatterplot新增hue_norm=norm参数,保证散点颜色映射规则和后续colorbar完全一致
内容的提问来源于stack exchange,提问作者user2974951
相关产品推荐
相关产品推荐

