首页 文章

设置colorbar以在matplotlib中显示数据范围之外的值

提问于
浏览
2

我正在尝试创建一个图形,其中颜色条将超出数据范围(高于数据的最大值) . 最终目的是我需要绘制模型输出的一系列图像(随着时间的推移),并且每小时存储在单独的文件中 . 我希望所有数字的颜色条都相同,这样它们就可以加入到动画中 .

这是一个示例脚本:

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

这产生了下图:

enter image description here

我一直在尝试使用我在网上找到的两种方法将颜色条的限制设置为数据范围之外的值(例如,从-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()

这似乎只改变显示的颜色,因此colormap中的第一个颜色对应于-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(下面的链接中的中间图) .

有谁知道如何让它做我想做的事情?像这个链接上的右图一样:http://orca.rsmas.miami.edu/~ajdas1/SOF/n.html

1 回答

  • 1

    对于大多数2D绘图功能(例如 imshowpcolor 等),设置 vminvmax 可以完成工作 . 但是, 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()
    

    结果:

    enter image description here

相关问题