多图统一颜色尺度实现:对角线距离散点图对比方案
多面板散点图统一颜色尺度实现方案
要实现多面板图的统一颜色尺度,核心是先汇总所有子图的z值(与对角线的距离),基于全局极值建立归一化规则,再将该规则应用到每个子图的绘图函数中,最后添加统一色条。具体步骤如下:
1. 收集并合并所有z值
先把不同配置下计算得到的所有对角线距离z值汇总到一个数组里,获取全局的最小值和最大值,确保颜色尺度能覆盖所有子图的数值范围。
示例代码:
import numpy as np # 假设你有三组不同配置的z值,替换成实际获取方式 z1 = scatter_diagdistance.get_z_values(config1) z2 = scatter_diagdistance.get_z_values(config2) z3 = scatter_diagdistance.get_z_values(config3) # 合并所有z值,计算全局极值 all_z = np.concatenate([z1, z2, z3]) vmin = all_z.min() vmax = all_z.max()
2. 创建统一的颜色归一化器和色映射
利用matplotlib的Normalize类,基于全局vmin和vmax生成归一化规则,搭配你需要的颜色映射(比如viridis)。
import matplotlib.pyplot as plt from matplotlib.colors import Normalize norm = Normalize(vmin=vmin, vmax=vmax) cmap = plt.cm.viridis # 可根据需求替换成其他色映射
3. 绘制多面板子图并应用统一尺度
调用scatter_diagdistance绘图时,传入统一的norm和cmap参数,确保所有子图使用相同的颜色转换规则。
# 创建多面板布局 fig, axes = plt.subplots(1, 3, figsize=(15, 5)) # 绘制第一个子图 scatter_diagdistance(ax=axes[0], z=z1, norm=norm, cmap=cmap, label="配置1") # 绘制第二个子图 scatter_diagdistance(ax=axes[1], z=z2, norm=norm, cmap=cmap, label="配置2") # 绘制第三个子图 scatter_diagdistance(ax=axes[2], z=z3, norm=norm, cmap=cmap, label="配置3") # 为每个子图添加基础标签 for ax in axes: ax.set_xlabel("X轴") ax.set_ylabel("Y轴") ax.legend()
4. 添加全局统一色条
在整个画布上添加色条,关联之前创建的归一化器和色映射,确保色条能对应所有子图的颜色尺度。
# 添加色条,适配多面板布局 fig.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=cmap), ax=axes, orientation='vertical', fraction=0.02, pad=0.05) plt.tight_layout() plt.show()
关键补充
如果你的scatter_diagdistance是自定义函数,需要确保它支持接收norm和cmap参数,并在内部传递给散点绘制逻辑,示例修改如下:
def scatter_diagdistance(ax, x, y, z, norm=None, cmap=None, **kwargs): # 若函数内部未计算z值,可在此添加对角线距离计算逻辑 # z = np.abs(x - y) # 绘制散点时传入归一化器和色映射 sc = ax.scatter(x, y, c=z, norm=norm, cmap=cmap, **kwargs) return sc
内容的提问来源于stack exchange,提问作者Whitehot
相关产品推荐
相关产品推荐

