我正在尝试创建一个颜色栏将超出数据范围(高于数据的最大值)的图形。最终目的是我需要绘制模型输出的一系列图像(随着时间的推移),并且每小时存储在单独的文件中。我希望所有数字的颜色条都相同,这样它们就可以加入到动画中。
以下是一个示例脚本:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 360, 1.5)
y = np.arange(-90, 90, 1.5)
lon, lat = np.meshgrid(x, y)
noise = np.random.random(lon.shape) # values in range [0, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise)
plt.colorbar()
这产生了下图:
我一直在尝试使用我在网上找到的两种方法将颜色条的限制设置为数据范围之外的值(例如,从-1。到2.):
在绘图线内设置vmin = -1和vmax = 2:
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise, vmin=-1., vmax=2.)
plt.colorbar()
这似乎只改变显示的颜色,因此颜色图中的第一种颜色对应于-1而最后一种颜色对应于2,但它不会扩展颜色条以显示这些值(左下图链接)
另一个是尝试在颜色栏中强制执行刻度以扩展到该范围:
fig = plt.figure()
ax = fig.add_subplot(111)
plt.hold(True)
plt.contourf(lon, lat, noise)
plt.colorbar(ticks=np.arange(-1,2.1, .2))
这导致定义的刻度位置,但仅限于数据的范围,即颜色栏仍然不会从-1延伸到2(下面的链接中间的数字)。 / p>
有谁知道如何让它做我想做的事情?类似于此链接上的右图:http://orca.rsmas.miami.edu/~ajdas1/SOF/n.html
答案 0 :(得分:3)
Colorbar limits are not respecting set vmin/vmax in plt.contourf. How can I more explicitly set the colorbar limits?提供了解决此问题的好例子。
如果一系列图像的颜色栏共享相同的 ScalarMappable实例,但不共享由每个plt.contourf( )。 在https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar
中有更多详细信息我们可以解决这样的问题:
import matplotlib.pyplot as plt
import matplotlib.cm as cm
fig = plt.figure()
ax = fig.add_subplot(111)
m0=ax.contourf(lon, lat, noise, vmin=-1., vmax=2.)
m = plt.cm.ScalarMappable(cmap=cm.coolwarm)
m.set_clim(-1, 2)
fig.colorbar(m,ax=ax)
我们使用fig.colorbar()中的m (ScalarMappable实例),而不是使用m0 (由contourf创建的QuadContourSet实例),因为颜色条用于描述可映射参数。 https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar
m.set_clim
中的 clim应该与contourf
中的vmin / vmax相匹配。
答案 1 :(得分:1)
对于大多数2D绘图功能(例如imshow
,pcolor
等),设置vmin
和vmax
可以完成工作。但是,contourf
(以及contour
)会在映射颜色时考虑您要求它绘制轮廓的levels
:
如果未指定levels
参数,则该函数会自动从数据的最小值到最大值生成10个等间距的级别。因此,要实现您想要的(对不同输入数据的一致性),您必须明确指定级别:
import matplotlib.pyplot as plt
import numpy as np
# generate data
x = np.arange(0, 360, 1.5)
y = np.arange(-90, 90, 1.5)
lon, lat = np.meshgrid(x, y)
noise = np.random.random(lon.shape)
# specify levels from vmim to vmax
levels = np.arange(-1, 2.1, 0.2)
# plot
fig = plt.figure()
ax = fig.add_subplot(111)
plt.contourf(lon, lat, noise, levels=levels)
plt.colorbar(ticks=levels)
plt.show()
结果: