2017-10-16 552 views
1

我一直在玩from_levels_and_colors函數,所以我可以在pcolormesh圖上有一個擴展的colorbar,類似contourf。這是我的例子contourf情節:pyplot.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() 

contouf example

要產生類似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 example

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

+0

contourf圖的顏色是從相應時間間隔的中間取得的。對於像pcolor圖那樣具有更多「層次」的情節來說,很難複製這種行爲。 – ImportanceOfBeingErnest

回答

1

問題是contourf圖的顏色是從相應時間間隔的中間取得的。要爲pcolor圖表複製相同的行爲,您需要選擇不同於顏色地圖(​​)的等距範圍的顏色,但選擇顏色作爲地圖的兩個端點和層級邊界之間的相應平均值。

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() 

enter image description here

爲了更好地瞭解解決方案,您可能希望通過

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" 

這取代了線cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors, extend='both')可以說得清楚,最終使用的顏色和顏色映射來自哪裏。

+0

感謝您的詳細解釋。是否選擇記錄「contourf」顏色的方法?這感覺就像我應該能夠查找的東西! – RuthC

+1

我不知道它是否在文檔中的某個地方。至少有一個[源代碼中的註釋](https://github.com/matplotlib/matplotlib/blob/e6448bafc471c7b2e620dd38a95837c887289799/lib/matplotlib/contour.py#L1259)說:「顏色是基於圖層的中點,除了 擴展終端層。「如果看起來夠深,可以從[source](https://github.com/matplotlib/matplotlib/blob/e6448bafc471c7b2e620dd38a95837c887289799/lib/matplotlib/contour.py#L1241)中閱讀。 – ImportanceOfBeingErnest