2017-12-05 22 views
0

私は、複数の図と対応するカラーバーを持つプロットを作成しています。このページhttp://www.sc.eso.org/~bdias/pycoffee/codes/20160407/gridspec_demo.htmlは、そうする最良の方法を知っていると主張しています。私は彼らを信じる傾向がある。
しかし、私はそれを行う際にカラーバーのkwagsをadressing問題にその方法を実行していますgridspecでカラーバーを移動する

from matplotlib.colorbar import Colorbar 
import matplotlib.gridspec as gridspec 
import matplotlib.pyplot as plt 
import numpy as np 
median = np.zeros((100,100)) 
map0 = np.zeros((100,100)) 
map1 = map0 
map2 = map0 

fig = plt.figure() 
plt.tight_layout() 
gs = gridspec.GridSpec(2,6) 

ax = plt.subplot(gs[0,0]) 
cbax = plt.subplot(gs[0,1]) 

ax1 = plt.subplot(gs[0,2]) 
cbax1 = plt.subplot(gs[0,3]) 

ax2 = plt.subplot(gs[0,4]) 
cbax2 = plt.subplot(gs[0,5]) 

ax3 = plt.subplot(gs[1,0]) 
cbax3 = plt.subplot(gs[1,1]) 

ax4 = plt.subplot(gs[1,2]) 
cbax4 = plt.subplot(gs[1,3]) 

ax5 = plt.subplot(gs[1,4]) 
cbax5 = plt.subplot(gs[1,5]) 

cax = ax.imshow(map0) 
ax.contour(median) 
cb = Colorbar(ax = cbax,mappable = cax,shrink=0.8) 

cax1 = ax1.imshow(map1) 
ax1.contour(median) 
cb1 = Colorbar(ax = cbax1,mappable = cax1) 

cax2 = ax2.imshow(map2) 
ax2.contour(median) 
cb2 = Colorbar(ax = cbax2,mappable = cax2) 

cax3 = ax3.imshow(map0/median) 
ax3.contour(median) 
cb3 = Colorbar(ax = cbax3,mappable = cax3) 

cax4 = ax4.imshow(map1/median) 
ax4.contour(median) 
cb4 = Colorbar(ax = cbax4,mappable = cax4) 

cax5 = ax5.imshow(map2) 
ax5.contour(median) 
cb5 = Colorbar(ax = cbax5,mappable = cax5) 

私は今kwargsからshrinkおよびまたはpadを呼び出すと、私は次のメッセージが出ます:

Traceback (most recent call last): 
    File "plot_integratedMaps.py", line 173, in <module> 
    main() 
    File "plot_integratedMaps.py", line 171, in main 
    plot_integratedMaps(map630,map869,mapTot,median) 
    File "plot_integratedMaps.py", line 129, in plot_integratedMaps 
    cb = Colorbar(ax = cbax,mappable = cax,shrink=0.8) 
    File "/usr/local/lib/python2.7/dist-packages/matplotlib/colorbar.py", line 943, in __init__ 
    ColorbarBase.__init__(self, ax, **kw) 
TypeError: __init__() got an unexpected keyword argument 'shrink' 

gs[0,1]にカラーバーを埋め込むことができず、代わりにgs[0,1]を移動しなければならないと思います。しかし、なぜ縮みがうまくいかないのか分かりません。

Python 2.7.12

+0

追記:何かの「最良の方法」を発見したと主張するチュートリアルを信じることはありません。それは確かに真実ではありません。 – ImportanceOfBeingErnest

答えて

1

を使用しています、私はそれが役に立つ直接リンクのようColorbarを作成するために考えていません。代わりにfig.colorbar()を使用できます。しかし、これは問題に接するだけです。

まず、プロットの隣にカラーバーを作成することを検討してください。あなたはカラーバーがaxは、それが属する軸よりも小さい係数0.8であることを置かれている軸をしたいので、ここで

import matplotlib.pyplot as plt 
import numpy as np 

median = np.zeros((100,100)) 
map0 = np.zeros((100,100)) 

fig, ax = plt.subplots() 

im = ax.imshow(map0) 
ax.contour(median) 
cb = fig.colorbar(im, ax=ax, shrink=0.8) 

plt.show() 

は、shrink正常に動作します。

ここで、カラーバーを配置する軸を指定すると、shrinkは意味を持ちません。軸をカラーバー関数内に作成する必要はなく、外部に供給するからです。

import matplotlib.pyplot as plt 
import numpy as np 

median = np.zeros((100,100)) 
map0 = np.zeros((100,100)) 

fig, (ax,cax) = plt.subplots(ncols=2) 

im = ax.imshow(map0) 
ax.contour(median) 

#using `shrink` here would produce an error, 
# because the colorbar axes (cax) already exists 
# instead of 
# cb = fig.colorbar(im, cax=cax, shrink=0.8) 
# you need 
cb = fig.colorbar(im, cax=cax) 

plt.show() 

これは、gridspecには依存しないことに注意してください。グリッドスペックを使用するかどうかは味の問題ですが、単純なプロットでは必ずしも必要ではありません。

プロット数が多い場合は、表示する内容によっても異なります。質問の編集例は、通常のグリッドのように見えます。ここで、各サブプロットのカラーバー軸の作成はmake_axes_locatableで効率的に行うことができます。上記を取る

from mpl_toolkits.axes_grid1 import make_axes_locatable 
import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.rand(6,6) 

fig, axes = plt.subplots(nrows=2, ncols=3) 

for ax in axes.flatten(): 
    im = ax.imshow(data) 
    div = make_axes_locatable(ax) 
    cax = div.append_axes("right", size="5%", pad=0.1) 
    cbar = fig.colorbar(im, cax=cax) 

plt.tight_layout()  
plt.show() 

enter image description here

、あなたは除算器を軸が、いつものように、あなたのカラーバーを作成し、shrink引数を使用し、これを使用しないことにより、カラーバーを縮小することがあります。

import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.rand(6,6) 

fig, axes = plt.subplots(nrows=2, ncols=3) 

for ax in axes.flatten(): 
    im = ax.imshow(data) 
    cbar = fig.colorbar(im, ax=ax, shrink=0.4) 

plt.tight_layout()  
plt.show() 

enter image description here

+0

'これはgridspecの独立であることに注意してください。'私はグリッドスペックを使ってどうやっているのか分かりません(私のプロットは複雑です(つまり、3 * 3または3 * 9のカラーバー) 。 とにかく私はあきらめて、ちょうどそれをサブプロットでやっていますね... – Sebastiano1991

+0

あなたの質問には単一のサブプロットがあり、それは縮小引数について質問しました。もちろん、グリッドが大きい場合は、グリッドスペックが意味をなさないことがあります。あなたが実際に問題を持って質問を編集したいのであれば(これは明らかに縮小引数ではありません)、私は自分の答えを編集することができます。 – ImportanceOfBeingErnest

+0

なぜ、あなたがなぜ縮小引数を使用できないのか説明したので、今問題は何ですか? – ImportanceOfBeingErnest

関連する問題