我一直在使用from_levels_and_colors
函数,因此我可以在pcolormesh图上使用扩展颜色条,类似于contourf。这是我的示例contourf plot:
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中的颜色浅。我如何选择它们才能匹配?
答案 0 :(得分:1)
问题是contourf
绘图的颜色是从相应间隔的中间获取的。要复制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_and_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"
这可能会更清晰,最终使用的颜色和色彩图来自哪里。