在离散colorbar的pcolormesh图中使用extend的方法

7
我正在尝试创建一个具有离散色条的pcolormesh图。输出应满足以下条件:
  1. 第一级应为白色
  2. 数据应在某个级别被截断
  3. 截断以上的数据应具有单独的颜色(即使用颜色映射的最后一种颜色)
我已经接近成功,但是“extend”关键字的行为并不像我所期望的那样(“max-arrow”中的颜色与最后一个级别相同-请参见示例)。如何将“vmax”以上的值设置为单独的颜色(即使用任何颜色映射的最后一种颜色)?
import numpy as np
import xarray as xr
import matplotlib as mpl
import matplotlib.pyplot as plt

ds = xr.Dataset(
    coords={'lon': np.arange(-180, 180, 10),
            'lat': np.arange(-85, 90, 10)},
    data_vars={'data': (('lat', 'lon'), np.random.rand(18, 36))})

cmap = plt.cm.get_cmap('Reds')
cmap.set_under('w')
# cmap.set_over()  # do something here?
levels = np.arange(0, .7, .1)
ds.data.plot.pcolormesh(
    cmap=cmap,
    vmin=levels[1],
    # vmax=levels[-1],
    extend='max',
    norm = mpl.colors.BoundaryNorm(levels, ncolors=cmap.N, clip=False)
)

这里输入图片描述

我正在使用xarray,但plt.pcolormesh的行为也是一样的:

p = plt.pcolormesh(
    np.arange(-180, 180, 10),
    np.arange(-85, 90, 10),
    np.random.rand(18, 36),
    cmap=cmap,
    vmin=levels[1],
    # vmax=levels[-1],
    norm = mpl.colors.BoundaryNorm(levels, ncolors=cmap.N, clip=False)
)
plt.colorbar(p, extend='max') 

哇,有些奇怪的事情正在发生,我不会预期上述代码会给出所示的输出,因为指定 vminnorm 中的一个应该会覆盖另一个,但显然同时指定两者似乎可以以某种方式给出所需的绘图。 - ImportanceOfBeingErnest
1个回答

10

如果您设置cmap.set_over("blue"),则会看到蓝色作为超过最大值的颜色。

在此输入图片描述

但是,如果您希望使用渐变色表的最后一种颜色作为set_over的颜色,则需要制作一个渐变色表,该表在倒数第二个颜色处停止。为此,可以使用以下方法。如果我们从渐变色表中选取6种不同的颜色以及超出边界值的颜色,则从该渐变色表中选取7种颜色,将第一种颜色替换为白色,并使用前6种颜色作为边界间隔的颜色。然后,最后一种颜色用作超出边界值的颜色。

import numpy as np; np.random.seed(1)
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors

lon,lat = np.meshgrid(np.arange(-180, 180, 10), np.arange(-85, 90, 10))
data = np.sort(np.random.rand(18, 36),axis=1)

# create 7 boundaries between 0 and 0.6, to have 6 intervals
boundaries = np.arange(0, .7, .1)
# create list of 7(!) colors from colormap
cmap_reds = plt.cm.get_cmap('Reds',len(boundaries))
colors = list(cmap_reds(np.arange(len(boundaries))))
#replace first color with white
colors[0] = "white"
cmap = matplotlib.colors.ListedColormap(colors[:-1], "")
# set over-color to last color of list 
cmap.set_over(colors[-1])

cm = plt.pcolormesh(lon,lat,data,
    cmap=cmap,
    norm = mpl.colors.BoundaryNorm(boundaries, ncolors=len(boundaries)-1, clip=False)
)
plt.colorbar(cm, extend="max")
plt.show()

enter image description here


整洁,谢谢!默认行为是(即最后两个级别有相同的颜色)是否符合预期?我对此有些惊讶,你希望在什么情况下使用? - Lukas
小三角形不是水平的。因此,调色板的默认选择应该是对于_under或_over颜色取第一个或最后一个值,因为它没有额外的信息来说明这应该对应什么其他内容。使用set_over或set_under,您可以指定要使用的颜色;所以,是的,这都是预期的。 - ImportanceOfBeingErnest

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