2017-10-16 3 views
1

私はfrom_levels_and_colors関数を使って遊んでいます。そのため、contourfと同様にpcolormeshプロットに拡張カラーバーを配置することができます。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プロットを生成するために:ここに私の例では、contourfプロットである

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の中央の4色はcontourfよりも明るいです。どのようにしてそれらを選んで一致させることができますか?

+0

contourfプロットの色は、再指定間隔の途中から取得されます。 pcolorプロットのような "レベル"が多いプロットの場合、この動作を再現するのは本当に難しいです。 – ImportanceOfBeingErnest

答えて

1

contourfプロットの色は、再指定間隔の途中から取得されるという問題があります。 pcolorプロットの同じ動作を複製するには、カラーマップ(​​)から等間隔の範囲ではなく、マップの2つの端点とレベル境界間のそれぞれの平均として色を選択する必要があります。

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)には、「色はレイヤーの中間点に基づいていますただし、拡張末尾のレイヤーは です。また、十分に深く見える場合は、[ソース](https://github.com/matplotlib/matplotlib/blob/e6448bafc471c7b2e620dd38a95837c887289799/lib/matplotlib/contour.py#L1241)から読むことができます。 – ImportanceOfBeingErnest

関連する問題