簡體   English   中英

pyplot.contourf 如何從顏色圖中選擇顏色?

[英]How does pyplot.contourf choose colors from a colormap?

我一直在玩from_levels_and_colors函數,這樣我就可以在 pcolormesh 圖上有一個擴展的顏色條,類似於輪廓。 這是我的輪廓圖示例:

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 示例

pcolormesh 中的中間四種顏色比輪廓中的顏色淺。 我該如何選擇它們以使它們匹配?

問題是contourf圖的顏色取自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"

這可能會更清楚,最終使用的顏色和顏色圖來自哪里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM