设置等高线图中色条的限制

18

我看到了很多例子,但它们都不适用于我的情况。我想做的是为色条设置一个简单的最小值和最大值。设置图像cmap的范围很容易,但这不会将相同的范围应用于色条的最小值和最大值。

triang = Triangulation(x,y)
plt.tricontourf(triang, z, vmax=1., vmin=0.)
plt.colorbar()

尽管colormap范围现在固定在0到1之间,但色条仍然固定在数据z的限制上。

5个回答

14

我建议您将绘图放入一个fig中,并从这个使用colorbar的示例中获取灵感。

data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = colors.ListedColormap(['b','g','y','r'])
bounds=[0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm)
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds, 
     ticks=[0.5,1.5,2.5,3.5],)
plt.show()

你可以看到,你可以为色条和刻度设置bounds(界限)。

这不完全是你想要实现的,但是对fig的提示可能有所帮助。

这个例子也使用ticks来定义色条的刻度。

import numpy as np
import matplotlib.pyplot as plt

xi = np.array([0., 0.5, 1.0])
yi = np.array([0., 0.5, 1.0])
zi = np.array([[0., 1.0, 2.0],
               [0., 1.0, 2.0],
               [-0.1, 1.0, 2.0]])

v = np.linspace(-.1, 2.0, 15, endpoint=True)
plt.contour(xi, yi, zi, v, linewidths=0.5, colors='k')
plt.contourf(xi, yi, zi, v, cmap=plt.cm.jet)
x = plt.colorbar(ticks=v)
print x
plt.show()

太棒了!这个可运行。我之前尝试过,但是错过了plt.contourf里面的v。所以它一直没有工作。非常感谢。 - Jacques MALAPRADE

10
这可能是最简单的方法。
...(您展示的代码)
plt.colorbar(boundaries=np.linspace(0,1,5)) 

...


10

我本以为这个问题指出了一个错误,但事实上它是一个使用/兼容性限制。解决方案是创建所需色条范围的轮廓,并使用extend关键字参数。欲知详情,请参见此问题。感谢@tcaswell提供了这个解决方案:

import matplotlib.pyplot as plt
import numpy as np

x, y = np.mgrid[0:1:0.01, 0:1:0.01]
r = np.sqrt(x ** 2 + y ** 2)
z = np.sin(6 * np.pi * r)

fig0, ax0 = plt.subplots(1, 1, )
cf0 = ax0.contourf(x, y, z, np.arange(0, .5, .01),
                   extend='both')
cbar0 = plt.colorbar(cf0,)

输入图像描述

如果您不喜欢颜色条的刻度,可以使用cbar0.set_ticks进行调整。 我已经验证这也适用于tricontourf

我已经简化了@tcaswell的代码,只保留了所需的部分以获得所需的结果。 此外,他使用了新的viridis colormap,但希望您能理解。


1
色条上的尖端表示数据仍在继续,但等高线着色停止了。您可以使用 extend 关键字参数来控制这些尖端的存在,但请注意,如果您不使用它,则不会在指定范围之外进行任何着色(等高线)。 - farenorth

4
我遇到了相同的问题,并想出了一个具体(尽管没有意义)的问题示例。注释掉的contourf命令将创建一个颜色条,其边界与数据相同,而不是颜色限制。
tricontourf的级别选项似乎是解决此问题的好方法,但它需要使用extend ='both'选项来包括超过绘图中级别的值。
import matplotlib.tri as mtri
import numpy as np
from numpy.random import randn
from matplotlib import colors

numpy.random.seed(0)
x = randn(300)
y = randn(300)
z = randn(*x.shape)
triangles = mtri.Triangulation(x, y)
bounds=np.linspace(-1,1,10)
# sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1.)
sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1., levels = bounds,\
                    extend = 'both')
cb = colorbar(sc)
_ = ylim(-2,2)
_ = xlim(-2,2)

0

这是我的个人看法,我认为它更加清晰和统一

density=10
x = np.linspace(-1,1,num=density,endpoint=True)
y = np.linspace(-1,1,num=density,endpoint=True)
x = x.repeat(density)
y = np.hstack((y,)*density)
z = np.e**(-(x**2+y**2))

fig,  ax = plt.subplots()


vmin=0.30
vmax=0.60
plot_val = np.linspace(vmin, vmax, 300, endpoint=True)


cntr = ax.tricontourf(x, y, z, plot_val,
                      vmin=vmin,vmax=vmax,
                      extend='both'
                 )

cbar = fig.colorbar(cntr,ax=ax)
cbar.set_ticks(np.arange(0,0.61,0.1))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接