You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为非对称数据的tricontourf图设置对称色条范围

问题描述

我需要为大型二维数据集绘制tricontourf图,已编写如下代码:

import matplotlib.pyplot as plt
import numpy as np

# Load the 3D data file
data = np.genfromtxt("data.txt", skip_header=14, delimiter="	", dtype = float)
reflect = data[:,0]
emiss = data[:,1]
tempdiff = data[:,4]
    
fig, ax = plt.subplots()
cb = ax.tricontourf(reflect, emiss, tempdiff, 200, vmin = -800, vmax = 800, cmap = "seismic")
cbar = plt.colorbar(cb)
cbar.set_label(r'z', rotation = 270, labelpad = 13)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim([0.6,1])
ax.set_ylim([0,0.4])

plt.savefig('plot.pdf', bbox_inches='tight', format='pdf')
plt.savefig('plot.png', dpi=300, bbox_inches='tight', format='png')

plt.show()

生成的图像中z值存在较大负长尾,我希望使用发散色图(seismic),使色图中的白色线条对应z=0。请问能否设置-800到800的对称色条,同时消除当前图像中的长尾?我已尝试在tricontourf中使用vmin和vmax参数,但仅缩放了色图范围,未改变色条。

解决方案

要实现对称色条且消除长尾,需要同时截断超出范围的数据,并让色图中心严格对齐z=0,具体操作如下:

  • 用np.clip()截断tempdiff中超出[-800,800]的数值,直接消除长尾数据的影响;
  • 使用CenteredNorm归一化方法,确保色图的中心对应z=0,同时色条范围严格对称于0。

修改后的代码如下:

import matplotlib.pyplot as plt
import numpy as np

# Load the 3D data file
data = np.genfromtxt("data.txt", skip_header=14, delimiter="	", dtype=float)
reflect = data[:,0]
emiss = data[:,1]
tempdiff = data[:,4]

# 截断超出[-800, 800]的数据,消除长尾
tempdiff_clipped = np.clip(tempdiff, -800, 800)

fig, ax = plt.subplots()
# 使用CenteredNorm确保色图中心为0,范围对称
norm = plt.CenteredNorm(vcenter=0, halfrange=800)
cb = ax.tricontourf(reflect, emiss, tempdiff_clipped, 200, cmap="seismic", norm=norm)
cbar = plt.colorbar(cb)
cbar.set_label(r'z', rotation=270, labelpad=13)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim([0.6,1])
ax.set_ylim([0,0.4])

plt.savefig('plot.pdf', bbox_inches='tight', format='pdf')
plt.savefig('plot.png', dpi=300, bbox_inches='tight', format='png')

plt.show()

关键说明

  1. np.clip(tempdiff, -800, 800):将所有小于-800的数值设为-800,大于800的设为800,彻底截断长尾数据,避免其影响色图显示。
  2. CenteredNorm(vcenter=0, halfrange=800):这个归一化方法会把vcenter - halfrange(即-800)映射到色图的最小值,vcenter + halfrange(即800)映射到最大值,确保z=0正好对应seismic色图的白色中心,同时色条范围完全对称。

内容的提问来源于stack exchange,提问作者colorofeternity22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:03:13