2017-04-09 28 views
2

AxesGridツールキットを使用するプロットに別のカラーバーを追加したいと思います。たとえば、左側にImageGridを使用してカラーバーの軸を追加し、右側に別のものを手動で追加します。ここに簡単な例があります:matplotlib axesgrid - 追加カラーバー?

f = plt.figure(1) 
grid = ImageGrid(f, 111, # similar to subplot(111) 
       nrows_ncols=(2, 2), 
       axes_pad=0.01, 
       add_all=True, 
       cbar_location="left", 
       label_mode='L', 
       cbar_mode="edge", 
       cbar_size="3%", 
       cbar_pad="2%", 
       ) 
for i in range(3): 
    m = grid[i].matshow(np.arange(100).reshape((10, 10))) 
plt.colorbar(m, grid.cbar_axes[0]) 
m = grid[3].matshow(np.arange(100).reshape((10, 10)), cmap='plasma') 
plt.colorbar(m, shrink=0.5, anchor=(0, 0)) 
plt.show() 

グリッド内のサブプロットの1つの位置に新しいカラーバーを正確に一致させる方法を教えてください。私は少なくとも縮みとアンカーを使ってサイズとy位置を修正することができました...しかし、サブプロット間のパディングを考慮しようとすると、ちょっと複雑になってしまい、正方形ではなく長方形である場合...

enter image description here

+0

達成したいことがわかりません。 「新しいカラーバーをグリッド内のサブプロットの1つの位置に正確に一致させる」という文章は、さまざまな方法で解釈できます。私はあなたが示すプロットに何が間違っているかを明確に記述する方が良いと思います。左のカラーバーはどこにあるのですか?どこに正しいカラーバーが座りたいですか?どのポジションに揃えたいですか?それは正方形であることを意味します。これは、あなたの望むことですか?合計でいくつのカラーバーが必要ですか? – ImportanceOfBeingErnest

+0

私は左に1つのカラーバーを持っています。そして私は、左にあるものと同じように右に別のものを持っていきたいと思います - サブプロットの1つに揃えました。それの上にではなく、今の通りですが、隣にあります。 – Phlya

+0

私はAxesGridを使って良い解決策があるとは思わない。なぜなら、プロットの片側にのみサブプロットを許可するからです。 AxesGridを使用したい理由は、プロット間の間隔を避けたいということでしょうか?しかし、AxesGridの使用要件を取り除くことができれば、解決策は通常のサブプロットを使用することです。 – ImportanceOfBeingErnest

答えて

2

1つのオプションは、軸の1つの位置に従って手動でカラーバーの軸を配置することです。この目的のためには、最初にキャンバスを描画し、その位置が分かるようにする必要があります。次に、画像プロットの座標に従って新しい軸を作成することができます。この新しい軸はカラーバーの軸として機能します。

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

fig = plt.figure(1) 
grid = ImageGrid(fig, 111, # similar to subplot(111) 
       nrows_ncols=(2, 2), 
       axes_pad=0.01, 
       add_all=True, 
       cbar_location="left", 
       label_mode='L', 
       cbar_mode="edge", 
       cbar_size="3%", 
       cbar_pad="2%", 
       ) 
for i in range(3): 
    m = grid[i].matshow(np.arange(100).reshape((10, 10))) 
plt.colorbar(m, grid.cbar_axes[0]) 
m = grid[3].matshow(np.arange(100).reshape((10, 10)), cmap='plasma') 

# first draw the figure, such that the axes are positionned 
fig.canvas.draw() 
#create new axes according to coordinates of image plot 
trans = fig.transFigure.inverted() 
g3 =grid[3].bbox.transformed(trans) 
pos = [g3.x1 + g3.width*0.02, g3.y0, g3.width*0.03, g3.height ] 
cax = fig.add_axes(pos) #l,b,w,h 
# add colorbar to new axes 
plt.colorbar(m, cax=cax) 


plt.show() 

enter image description here

すなわち変化と、この方法は、例えば、図中の軸の位置に依存します姿が鼓動しているので、思いもよらないことが起こるかもしれません。

描画された座標に依存しない別の方法は、挿入軸を使用して軸の外側に挿入することです。このように、インセットが配置されている座標は軸の座標です。したがって、カラーバーは軸に従って位置が変わります。

from mpl_toolkits.axes_grid1.inset_locator import inset_axes 

cax = inset_axes(grid[3], "3%", "100%", loc=3, bbox_to_anchor=(1.02,0,1,1), 
       bbox_transform=grid[3].transAxes, borderpad=0.0) 
plt.colorbar(m, cax=cax) 
+0

ありがとう!ですから、基本的にカラーバーの軸の追加は、何かが図形のレイアウトを変更する場合に備えて、最後に行うべきことでしょうか? – Phlya

+0

私は潜在的に良い方法を見つけました、更新された答えを見てください。 – ImportanceOfBeingErnest

+0

ありがとう、私は自分自身inset_axesを見つけて、それを試していた!私は今それを試してみましょう。 – Phlya

関連する問題