具有轮廓水平的连续色条

时间:2017-06-12 11:44:55

标签: python matplotlib

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

enter image description here

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

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

2 个答案:

答案 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()

enter image description here

答案 1 :(得分:0)

我遇到了完全相同的问题,我只是通过在代码中的颜色条之后定义轮廓来解决此问题。