使用tricontourf设置非均匀间隔层级时的色条异常问题
问题描述
我尝试对非均匀间隔的数据进行插值并绘制等高线图,希望手动设置任意等高线层级,但遇到了色条问题:向tricontourf传入自定义层级数组后,色条中除最后一个层级外其余均为同一种颜色,我需要每个层级对应不同颜色。
使用的代码如下:
import numpy as np import matplotlib.pyplot as plt data = np.loadtxt('testdata.txt') x = data[:,0] y = data[:,1] z = data[:,2] levels = [0, 1, 2, 3, 4, np.max(z)] plt.figure() cntr1 = plt.tricontourf(x,y,z, levels=levels, cmap="viridis_r") plt.colorbar(cntr1, ticks=levels) plt.show()
生成的图表中前4个层级颜色均相同:
解决方案
问题出在使用了连续色图(viridis_r),当自定义的层级间隔远小于色图的颜色渐变区间时,前几个层级对应的颜色差异极小,视觉上看起来完全相同。解决方法是改用离散色图,让每个层级区间对应明确的不同颜色:
方法1:从现有连续色图生成离散色图
通过ListedColormap从viridis_r中提取对应数量的离散颜色,确保每个层级区间有独立的颜色:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap data = np.loadtxt('testdata.txt') x = data[:,0] y = data[:,1] z = data[:,2] levels = [0, 1, 2, 3, 4, np.max(z)] # 层级数为6,对应5个区间,因此提取5种离散颜色 cmap = ListedColormap(plt.cm.viridis_r(np.linspace(0, 1, len(levels)-1))) plt.figure() cntr1 = plt.tricontourf(x,y,z, levels=levels, cmap=cmap) plt.colorbar(cntr1, ticks=levels) plt.show()
方法2:手动指定自定义颜色列表
如果需要更精准的颜色控制,可以直接定义颜色列表,再转为离散色图:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap data = np.loadtxt('testdata.txt') x = data[:,0] y = data[:,1] z = data[:,2] levels = [0, 1, 2, 3, 4, np.max(z)] # 手动指定5种不同颜色,对应5个层级区间 custom_colors = ['#440154', '#482878', '#3e4989', '#31688e', '#26828e'] cmap = ListedColormap(custom_colors) plt.figure() cntr1 = plt.tricontourf(x,y,z, levels=levels, cmap=cmap) plt.colorbar(cntr1, ticks=levels) plt.show()
原理说明
连续色图是基于数值范围的渐变映射,当你的层级区间(0-1、1-2等)在整体数据范围中占比极小时,色图分配给这些区间的颜色差异会非常细微。而离散色图会为每个区间分配独立的、差异明显的颜色,完美匹配自定义层级的需求。
内容的提问来源于stack exchange,提问作者Vladimir Vladimirovich
相关产品推荐
相关产品推荐

