python - 在具有离散颜色条的 pcolormesh 图中使用扩展

标签 python matplotlib plot colorbar colormap

我正在尝试创建一个带有离散颜色条的 pcolormesh 图。输出应满足以下条件:

  1. 第一层应该是白色
  2. 数据应该在一定程度上被截断
  3. 截止点以上的数据应该有一个单独的颜色(即颜色图的最后一种颜色)

我快到了,但“扩展”关键字的行为方式与我预期的不同(“最大箭头”中的颜色与最后一层的颜色相同 - 请参见示例)。 如何将高于“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)
)

enter image description here

我正在使用 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') 

最佳答案

事实上,如果您设置 cmap.set_over("blue"),您会看到蓝色是超过最大值的值的颜色。

enter image description here

但是,如果您想使用颜色图的最后一种颜色作为 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

关于python - 在具有离散颜色条的 pcolormesh 图中使用扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613920/

相关文章:

python-3.x - 使用 matplotlib 或 seaborn 绘制两列之间的关系

python - 在同一轴上创建两个标签并填补周末空白

python - PyCharm 和 ipython 的组合无法导入 qt5 或 Qt5Agg

python - Python 中的数密度等值线

r - ggplot2:代表个人观察的点和代表平均值和标准差的条形图

Python 使用请求时错误的 SSL 版本

python - 在应用程序启动时检查数据库架构是否与 SQLAlchemy 模型匹配

python - 如何找到 pip3 安装模块的导入名称/ key

r - 如何使用多边形()在概率密度曲线下方着色

python - re.findall 正则表达式挂起或非常慢