Skip to main content
 首页 » 编程设计

python之具有等高线水平的连续颜色条

2025年05月04日15wayfarer

我正在尝试为我的等高线图添加一个颜色条,但该条不是连续的。

情节是用以下代码制作的。

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.cm 
 
cmap = matplotlib.cm.viridis 
contour_start = 500 
contour_num = 20 
contour_factor = 1.20 
 
# calculate contour levels 
cl = contour_start * contour_factor ** np.arange(contour_num)  
negcl = cl[::-1] * -1 
supercl = np.concatenate([negcl, cl]) 
 
# create the figure 
fig = plt.figure(figsize=(6,5), dpi=150) 
ax = fig.add_subplot(111) 
# plot the contours 
cp = ax.contour(datab, supercl, cmap=cmap,) 
 
cbar = plt.colorbar(cp) 
 
# cbar.set_alpha(1) 
# cbar.draw_all() 
plt.show() 

我尝试添加

cbar.set_alpha(1) 
cbar.draw_all() 

但它没有用,所以我实际上认为这与谨慎的轮廓级别有关。我不确定。

我意识到数据未包含在内,代码将无法按原样运行。我没有包括在内,因为数据加载部分依赖于另一个不常见的库。尽管如此,我还是想指出 matplotlib 文档,它有一个类似的图和一个类似的颜色条(最后一个例子,右边的颜色条): https://matplotlib.org/examples/pylab_examples/contour_demo.html

请您参考如下方法:

一种解决方案是从与等高线图本身不同的 ScalarMappable 创建颜色条。然后,新创建的 ScalarMappable 将通过 Normalize 实例从等高线图中获取颜色范围。

以下代码是 contour-demo 的改编版本例子。

import numpy as np 
import matplotlib.mlab as mlab 
import matplotlib.colors 
import matplotlib.pyplot as plt 
 
x = np.arange(-3.0, 3.0, 0.025) 
X, Y = np.meshgrid(x, x) 
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
Z = 10.0 * (Z2 - Z1) 
 
fig, ax = plt.subplots() 
 
cs = plt.contour(X, Y, Z, cmap="viridis") 
 
norm= matplotlib.colors.Normalize(vmin=cs.cvalues.min(), vmax=cs.cvalues.max()) 
# a previous version of this used 
#norm= matplotlib.colors.Normalize(vmin=cs.vmin, vmax=cs.vmax) 
# which does not work any more 
sm = plt.cm.ScalarMappable(norm=norm, cmap = cs.cmap) 
sm.set_array([]) 
fig.colorbar(sm, ticks=cs.levels) 
 
plt.show()