2017-08-23 19 views
0

私は今、1つのカラーバーを共有するために3つの垂直に積まれたpcolormeshプロットを取得しようとしています。さまざまなGoogle検索がmatplotlibツールキットのImageGrid機能に私を導いてくれました。私は好きになり始めています(私はそれをよく理解していませんが)。matplotlib_toolkits上の軸のサイズ変更ImageGrid

subplot2gridのcolspan引数のように、Axesオブジェクトを複数の列にまたがって「ストレッチ」する機能がありません。デモコードfound hereで遊んで、私はこのイメージを作り出すことができるという点に着きます。

現在、図形の中央に配置されています。両端の空白は、中心軸の幅と同じ幅になります。単純に、これらの3つのプロットのそれぞれを、プロットの右側とこの高さにカラーバーを維持しながら、スペースの幅に伸ばしてください。

enter image description here

これまでのところ、(実際にビットが不足していると、単にサンプル・コードである)私が試みたコード。どんな助けでも大歓迎です!

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


def get_demo_image(): 
    from matplotlib.cbook import get_sample_data 
    f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) 
    z = np.load(f) 
    # z is a numpy array of 15x15 
    return z, (-3, 4, -4, 3) 

if 1: 
    F = plt.figure(1, (6, 6)) 
    F.clf() 

    # prepare images 
    Z, extent = get_demo_image() 
    ZS = [Z[i::3, :] for i in range(3)] 
    extent = extent[0], extent[1]/3., extent[2], extent[3] 

    # demo 2 : shared colorbar 
    grid2 = ImageGrid(F, 111, 
         nrows_ncols=(3, 1), 
         direction="column", 
         axes_pad=0, 
         add_all=True, 
         label_mode="1", 
         share_all=False, 
         cbar_location="right", 
         cbar_mode="single", 
         cbar_size="10%", 
         cbar_pad=0.05, 
        ) 

    grid2[0].set_xlabel("X") 
    grid2[0].set_ylabel("Y") 

    vmax, vmin = np.max(ZS), np.min(ZS) 
    import matplotlib.colors 
    norm = matplotlib.colors.Normalize(vmax=vmax, vmin=vmin) 

    for ax, z in zip(grid2, ZS): 
     im = ax.imshow(z, norm=norm, 
         origin="lower", extent=extent, 
         interpolation="nearest") 

    # With cbar_mode="single", cax attribute of all axes are identical. 
    ax.cax.colorbar(im) 
    ax.cax.toggle_label(True) 

    grid2[0].set_xticks([-2, 0]) 
    grid2[0].set_yticks([-2, 0, 2]) 

    plt.draw() 
    plt.show() 
+0

あなたは 'imshow'sの' aspect'を変更してみてください可能性があります。たとえば、「aspect = 0.5」に設定すると、図が水平方向に伸びるはずです。デフォルトでは、これは1に設定されます。つまり、x軸の距離はy軸の等価距離と等しくなります。 – tom

答えて

1

ImageGridは、同じアスペクト比の画像をホストするように設計されています。等しいアスペクトの画像を持ちたくない場合は、通常のサブプロットを使用する方がはるかに簡単です。グリッド上にサブプロットを配置するには、matplotlib.gridspecを使用すると便利です。

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(1) 
import matplotlib.gridspec as gridspec 

gs = gridspec.GridSpec(3, 2, width_ratios=[1,.05]) 
fig = plt.figure() 
fig.subplots_adjust(wspace=0.1, hspace=0) 

norm=plt.Normalize(0,1) 
for i in range(3): 
    ax = fig.add_subplot(gs[i,0]) 
    im= ax.imshow(np.random.rand(5,36)*0.3+i*0.3, norm=norm, aspect="auto") 

cax = fig.add_subplot(gs[:,1]) 
fig.colorbar(im, cax=cax) 

plt.show() 

enter image description here

+0

これは私が何をしたのかとまったく同じように見える - ありがとう!ドキュメンテーションを読んで、私がまだaxパラメータを使うことができることが分かると、もっと簡単になります。私はこれをデフォルトとして使用しなければならないかもしれません - 私はこのようなプロットをたくさん作成します。 – Yoshi

関連する問題