2017-06-23 35 views
1

gridspecまたはfig.add_subplotsで生成されたサブプロットで複数のカラーバーを揃えようとしています。詳細な位置調整が可能なので、matplotlib(v2.02)にfig.add_axesのカラーバーを追加したいと思います。しかし、私は整列を行うために図形の位置を取得する必要があります。 ax.get_position()機能は、正しい座標を返すように表示されません。ここでMatplotlibの軸の位置とカラーバーのアライメント

はMWEです:

import matplotlib.gridspec as gridspec 
import scipy.misc 

fig = plt.figure(1) 
fig.set_tight_layout(True) 
gs = gridspec.GridSpec(2,2) 
ax = plt.subplot(gs[0,0]) 
lena = scipy.misc.face() 
im = ax.imshow(lena) 
axpos = ax.get_position() # bbox# get_position().get_points() 
cbar_axis = fig.add_axes([axpos.x0, axpos.y0-0.1, axpos.width, 0.05]) 
colorbar = fig.colorbar(im, cax=cbar_axis, orientation="horizontal") 

カラーバーが一致していない: image with misaligned colorbar

を、私は、コードの実行後axposを印刷する場合、およびax.get_position()、2つは同じではありません。これは、コードが実行されている間にax.get_position()が古い情報を使用していることを示しています。私はplt.show()plt.draw()を追加しようとしましたが、これは修正されません。

どのように軸位置を取得できますか?

EDITは:

私はより良い私がやろうとしていますとmake_axes_locatableが表示されない理由を(まだ)私のために動作するかを示すために(https://stackoverflow.com/a/44731797/238882)の下に掲載ソリューションを修正しました。 1つの列の下に2つのカラーバーが、もう1つの列の下に2つのカラーバーが必要です。 make_axes_locatableでこれを行うと、次のコードが下の図になります。数字はすべて同じサイズのままで、グリッド内で整列させたいと思います。

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import scipy.misc 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

plt.close(1) 
fig, axes = plt.subplots(2,2) 
fig.set_tight_layout(True) 

lena = scipy.misc.face() 

for i, ax in enumerate(axes.flatten()): 

    im = ax.imshow(lena) 
    divider = make_axes_locatable(ax) 
    if i == 2: 
     ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True) 
     fig.add_axes(ax_cb) 
     fig.colorbar(im, cax=ax_cb, orientation="horizontal") 
     ax_cb2 = divider.new_vertical(size="10%", pad=0.3, pack_start=True) 
     fig.add_axes(ax_cb2) 
     fig.colorbar(im, cax=ax_cb2, orientation="horizontal") 
    if i == 3: 
     ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True) 
     fig.add_axes(ax_cb) 
     fig.colorbar(im, cax=ax_cb, orientation="horizontal") 

plt.show() 

enter image description here

答えて

1

(あなたが見つけたとして)通常、あなたは、このためかもしれないが、軸の絶対位置を使用するために、他の描かれたアーティストやキャンバスに配置された数値に応じて変更を望んでいません。

カラーバーを軸の下に配置するのが目的の場合、便利な方法はthis official exampleのようにmpl_toolkits.axes_grid1.make_axes_locatableを使用することです。

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import scipy.misc 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

fig = plt.figure(1) 
fig.set_tight_layout(True) 
gs = gridspec.GridSpec(2,2) 
ax = plt.subplot(gs[0,0]) 
lena = scipy.misc.face() 
im = ax.imshow(lena) 

divider = make_axes_locatable(ax) 

ax_cb = divider.new_vertical(size="5%", pad=0.3, pack_start=True) 
fig.add_axes(ax_cb) 

fig.colorbar(im, cax=ax_cb, orientation="horizontal") 

plt.show() 

enter image description here

add_axesで軸を設定しているとき、これはtight_layoutと全く互換性があることを注意ではありません。

divider.new_verticalの2番目の呼び出しを使用して軸をさらに分割して、エラーバーをさらに作成することができます。質問の編集した部分の

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import scipy.misc 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

fig, axes = plt.subplots(2,2) 
fig.set_tight_layout(True) 

lena = scipy.misc.face() 

for i, ax in enumerate(axes.flatten()): 

    im = ax.imshow(lena) 
    divider = make_axes_locatable(ax) 
    ax_cb = divider.new_vertical(size="10%", pad=0.3, pack_start=True) 
    ax_cb2 = divider.new_vertical(size="10%", pad=0.3, pack_start=True) 
    fig.add_axes(ax_cb) 
    fig.colorbar(im, cax=ax_cb, orientation="horizontal") 
    if i % 2 - 1: 
     fig.add_axes(ax_cb2) 
     fig.colorbar(im, cax=ax_cb2, orientation="horizontal") 

plt.show() 

enter image description here

編集:

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import scipy.misc 
from mpl_toolkits.axes_grid1 import make_axes_locatable 


fig, axes = plt.subplots(2,2) 
fig.set_tight_layout(True) 

lena = scipy.misc.face() 

for i, ax in enumerate(axes.flatten()): 

    im = ax.imshow(lena) 
    divider = make_axes_locatable(ax) 
    ax_cb = divider.new_vertical(size="8%", pad=0.3, pack_start=True) 
    ax_cb2 = divider.new_vertical(size="8%", pad=0.02, pack_start=True) 
    if i == 2: 
     fig.add_axes(ax_cb) 
     fig.colorbar(im, cax=ax_cb, orientation="horizontal") 
     fig.add_axes(ax_cb2) 
     fig.colorbar(im, cax=ax_cb2, orientation="horizontal") 
     ax_cb.tick_params(bottom=False,labelbottom=False) 
    if i == 3: 
     fig.add_axes(ax_cb) 
     fig.colorbar(im, cax=ax_cb, orientation="horizontal") 

plt.show() 

enter image description here

+0

最初に下の2番目のカラーバーを追加することはできますか?そして、4つのイメージ(このMWEに1つしか表示されません)をお互いに同じサイズに保ちますか? – mankoff

+0

4枚の画像のそれぞれに2つのカラーバーがありますか?画像は同じサイズですか? – ImportanceOfBeingErnest

+0

はい、4つの画像はすべて同じサイズです。左の列の下に2つのカラーバーがあり、右下に1つのカラーバーがあります。 – mankoff

関連する問題