我正在尝试为我的等高线图添加一个颜色条,但条形图不是连续的。
情节是用以下代码制作的。
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
答案 0 :(得分:5)
解决方案可以是从与轮廓图本身不同的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()
答案 1 :(得分:0)
我遇到了完全相同的问题,我只是通过在代码中的颜色条之后定义轮廓来解决此问题。