Python pyplot.contourf如何从颜色贴图中选择颜色?

Python pyplot.contourf如何从颜色贴图中选择颜色?,python,matplotlib,Python,Matplotlib,我一直在玩从_levels _和_colors函数的,这样我就可以在pcolormesh绘图上有一个扩展的色条,类似于contourf。以下是我的轮廓图示例: import numpy as np import matplotlib.pyplot as plt a = np.arange(12)[:,np.newaxis] * np.ones(8) levels = np.arange(1.5, 10, 2) plt.contourf(a, cmap='RdYlBu', levels=lev

我一直在玩从_levels _和_colors函数的
,这样我就可以在pcolormesh绘图上有一个扩展的色条,类似于contourf。以下是我的轮廓图示例:

import numpy as np
import matplotlib.pyplot as plt

a = np.arange(12)[:,np.newaxis] * np.ones(8)
levels = np.arange(1.5, 10, 2)

plt.contourf(a, cmap='RdYlBu', levels=levels, extend='both')
plt.colorbar()

要生成类似的pcolormesh绘图,我需要提供一系列颜色,因此我有:

from matplotlib.colors import from_levels_and_colors

n_colors = len(levels) + 1
cmap = plt.get_cmap('RdYlBu', n_colors)
colors = cmap(range(cmap.N))
cmap, norm = from_levels_and_colors(levels, colors, extend='both')
plt.pcolormesh(a, cmap=cmap, norm=norm)
plt.colorbar()


pcolormesh中的中间四种颜色比contourf中的颜色要浅。我如何选择它们以使它们匹配?

问题是
轮廓f
绘图的颜色取自相应间隔的中间。要为
pcolor
绘图复制相同的行为,您需要选择的颜色不仅仅是颜色贴图的等距范围(
colors=cmap(range(cmap.N))
),而是贴图的两个端点以及级别边界之间的各自平均值

cnorm = plt.Normalize(vmin=levels[0],vmax=levels[-1])
clevels = [levels[0]] + list(0.5*(levels[1:]+levels[:-1])) + [levels[-1]]
colors=plt.cm.RdYlBu(cnorm(clevels))
完整代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

a = np.arange(12)[:,np.newaxis] * np.ones(8)
levels = np.arange(1.5, 10, 2)

fig, (ax,ax2) = plt.subplots(ncols=2)

ax.set_title("contourf")
cf = ax.contourf(a, levels=levels, cmap='RdYlBu', extend='both') #, 
fig.colorbar(cf, ax=ax)

##### pcolormesh

cnorm = plt.Normalize(vmin=levels[0],vmax=levels[-1])
clevels = [levels[0]] + list(0.5*(levels[1:]+levels[:-1])) + [levels[-1]]
colors=plt.cm.RdYlBu(cnorm(clevels))

cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors, extend='both')
cf = ax2.pcolormesh(a, cmap=cmap, norm=norm)
ax2.set_title("pcolormesh")
fig.colorbar(cf,ax=ax2)


plt.tight_layout()
plt.show()

为了更好地理解解决方案,您可能需要将行
cmap,norm=matplotlib.colors.from_levels_和_colors(levels,colors,extend='both')
替换为

norm=matplotlib.colors.BoundaryNorm(levels, ncolors=len(levels)-1)

cmap = matplotlib.colors.ListedColormap(colors[1:-1], N=len(levels)-1)
cmap.set_under(colors[0])
cmap.set_over(colors[-1])
cmap.colorbar_extend = "both"

这可能会使它更清晰,最终使用的颜色和颜色贴图来自何处。

轮廓图的颜色取自相应间隔的中间。对于像pcolor绘图这样有更多“级别”的绘图,很难复制这种行为。感谢您的详细解释。选择
contourf
颜色的方法是否有文档记录?这感觉像是我应该能够查到的东西!我不知道它是否在文档中的某个地方。至少有一句话是这样说的:“颜色是基于图层的中点,除了延伸的末端图层。”如果你看得足够深,你可以从屏幕上看出来。