私の事例には当てはまらない例がたくさんあります。私がやりたいのは、カラーバーの単純な最小値と最大値を設定することです。画像cmapの範囲を設定するのは簡単ですが、これは同じ範囲をカラーバーの最小値と最大値に適用しません。以下のコードで説明できます:
triang = Triangulation(x,y)
plt.tricontourf(triang, z, vmax=1., vmin=0.)
plt.colorbar()
カラーバーはデータzの制限に固定されていますが、cmapの範囲は0〜1に固定されています。
図にプロットを組み込むことをお勧めします そして、カラーバーを使用してこのサンプルからインスピレーションを得ます
data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = colors.ListedColormap(['b','g','y','r'])
bounds=[0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm)
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds,
ticks=[0.5,1.5,2.5,3.5],)
plt.show()
カラーバーとティックの色にbounds
を設定できることがわかります。
それはあなたが達成したいものではありませんが、figへのヒントが役立ちます。
このもう1つはticks
を使用 と同様に、カラーバーのスケールを定義します。
import numpy as np
import matplotlib.pyplot as plt
xi = np.array([0., 0.5, 1.0])
yi = np.array([0., 0.5, 1.0])
zi = np.array([[0., 1.0, 2.0],
[0., 1.0, 2.0],
[-0.1, 1.0, 2.0]])
v = np.linspace(-.1, 2.0, 15, endpoint=True)
plt.contour(xi, yi, zi, v, linewidths=0.5, colors='k')
plt.contourf(xi, yi, zi, v, cmap=plt.cm.jet)
x = plt.colorbar(ticks=v)
print x
plt.show()
私はこの質問がバグを指摘していると思ったが、それはそれが使用法/互換性の制約であることを示している。解決策は、必要なカラーバーの範囲の輪郭を作成し、extend
kwargを使用することです。詳細については、 この問題 をご覧ください。このソリューションを提供してくれた @ tcaswell に感謝します。
import matplotlib.pyplot as plt
import numpy as np
x, y = np.mgrid[0:1:0.01, 0:1:0.01]
r = np.sqrt(x ** 2 + y ** 2)
z = np.sin(6 * np.pi * r)
fig0, ax0 = plt.subplots(1, 1, )
cf0 = ax0.contourf(x, y, z, np.arange(0, .5, .01),
extend='both')
cbar0 = plt.colorbar(cf0,)
ここから、カラーバーの目盛りが気に入らない場合は、cbar0.set_ticks
。これはtricontourf
でも機能することを確認しました。
@tcaswellのコードを、目的の結果を得るために必要なコードに単純化しました。また、彼は新しいviridisカラーマップを使用しましたが、うまくいけばアイデアが得られます。
これはおそらく最も簡単な方法です。
...(表示されるコード)
plt.colorbar(boundaries=np.linspace(0,1,5))
...
私は同じ問題にぶつかり、この問題の具体的な(意味はありませんが)例を思い付きました。コメント付きのcontourfコマンドは、色の制限ではなく、データと同じ境界を持つカラーバーを作成します。
Tricontourfのlevelオプションは、これを回避する良い方法のように思えますが、プロットのレベルを超える値を含めるにはextend = 'both'オプションが必要です。
import matplotlib.tri as mtri
import numpy as np
from numpy.random import randn
from matplotlib import colors
numpy.random.seed(0)
x = randn(300)
y = randn(300)
z = randn(*x.shape)
triangles = mtri.Triangulation(x, y)
bounds=np.linspace(-1,1,10)
# sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1.)
sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1., levels = bounds,\
extend = 'both')
cb = colorbar(sc)
_ = ylim(-2,2)
_ = xlim(-2,2)
ここに私自身のテイクがありますが、個人的にはもう少し明確で統一されていると思います
density=10
x = np.linspace(-1,1,num=density,endpoint=True)
y = np.linspace(-1,1,num=density,endpoint=True)
x = x.repeat(density)
y = np.hstack((y,)*density)
z = np.e**(-(x**2+y**2))
fig, ax = plt.subplots()
vmin=0.30
vmax=0.60
plot_val = np.linspace(vmin, vmax, 300, endpoint=True)
cntr = ax.tricontourf(x, y, z, plot_val,
vmin=vmin,vmax=vmax,
extend='both'
)
cbar = fig.colorbar(cntr,ax=ax)
cbar.set_ticks(np.arange(0,0.61,0.1))