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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:55:32