2017-09-20 23 views
0

私のプロットのカラーバーをプロットのサイズに合わせる必要はなく、カスタム高さに設定したいと思います。実際、私はカラーバーの高さに、図の高さに合わせてタイトルの上にタイトルを追加したいと思います。私は他の多くの時間を求めてきたプロット、同じ高さとカラーバーを持って管理しmatplotlibのカラーバーをカスタムの高さに変更する

ax3 = divider.append_axes('right', size='10%', pad=0.3) 
cb = plt.colorbar(Q, cax=ax3, ticks=[0.0, 3.0, 6.0, 9.0, 12.0, 15.0], format='%.1f') 

、今私はそれを縮小したいと思います。

他の質問に提示された提案に続いて、get_positionで最後のプロット軸の位置を取得した後、カラーバーにadd_axesという軸を明示的に指定することにしました。ここに私がやろうとしていることがあります。データなしカラーバーなしはちょうど私が私が期待した結果が届かないことを示すために、この例ではありません。

from __future__ import unicode_literals 
    import numpy as np 
    from scipy.interpolate import griddata 
    import matplotlib 
    import matplotlib.pyplot as plt 
    from matplotlib.patches import Circle 
    from matplotlib.pylab import cm 
    import matplotlib.colors as colors 
    from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size 

    matplotlib.rcParams.update({'font.size': 8}) 

    fig = plt.figure() 
    fig.set_size_inches(6.3,6.3) 

    ax1 = plt.subplot(111) 
    divider = make_axes_locatable(ax1) 
    ax2 = divider.append_axes('right', size='100%', pad=0.3) 

    axes = [ax1, ax2] 
    ltypes = ['dashed', 'solid'] 

    xi = np.linspace(-18.125, 18.125, 11) 
    yi = np.linspace(0, 28, 9) 
    xv, yv = np.meshgrid(xi, yi) 

    xcOdd = 0.2 
    zcOdd = 0.725 
    xcEven = 0.6 
    zcEven = 0.725 

    maskRadius = 0.15 

    for i in range(2): 
     ax = axes[i] 
     ax.set_xlabel('distance [m]') 
     if i == 0: 
      ax.set_ylabel('depth [m]') 
     if i == 1: 
      ax.set_yticklabels([]) 
     ax.invert_yaxis() 
     ax.tick_params(direction='in') 
     ax.set_aspect('equal') 
     odd = Circle((xcOdd, zcOdd), .15, linewidth=1.2, color='k', fill=False) 
     even = Circle((xcEven, zcEven), .15, linewidth=1.2, linestyle=ltypes[i], color='k', fill=False) 

     vmax = 15. 
     vmin = 0. 
     norm = matplotlib.colors.Normalize(vmin,vmax, clip=False) 

     color_map = matplotlib.colors.ListedColormap(plt.cm.Greys(np.linspace(0.25, 1, 5)), "name") 

     ax.add_patch(odd) 
     pad = 0.03 
     width = 0.03 

     pos = ax2.get_position() 

     ax3 = fig.add_axes([pos.xmax + pad, pos.ymin, width, 0.7*(pos.ymax-pos.ymin) ]) 

     plt.savefig('prova-vect-paper-test-2.eps', format='eps') 

はなぜget_positionは間違ったバウンディングボックスを返していますか?

+0

? – user2078621

+0

回答を提出したユーザーは、明らかに問題を解決しなかったため、回答を削除しました。実際の問題に関しては、あなたのプロットがどれほど正確に見えるかについてもっと詳しく説明したいと思うでしょう。 (これはまた、どのような種類の人物が表示されているかによって異なりますが、アスペクト比が等しいかどうかは異なります)。 – ImportanceOfBeingErnest

答えて

1

.get_position()から実際の位置を取得する前にキャンバスを描画する必要があります。これは、等しいアスペクト比のために、描画時間に軸がサイズと位置を変更するためです。私はもうこの質問にcommentaと回答を見ることができないのはなぜ

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

matplotlib.rcParams.update({'font.size': 8}) 

fig = plt.figure() 
fig.set_size_inches(6.3,6.3) 

ax1 = plt.subplot(111) 
divider = make_axes_locatable(ax1) 
ax2 = divider.append_axes('right', size='100%', pad=0.3) 

axes = [ax1, ax2] 


xi = np.linspace(-18.125, 18.125, 11) 
yi = np.linspace(0, 28, 9) 
xv, yv = np.meshgrid(xi, yi) 


for i in range(2): 
    ax = axes[i] 
    ax.set_xlabel('distance [m]') 
    if i == 0: 
     ax.set_ylabel('depth [m]') 
    if i == 1: 
     ax.set_yticklabels([]) 
    ax.invert_yaxis() 
    ax.tick_params(direction='in') 
    ax.set_aspect('equal') 
    vmax = 15. 
    vmin = 0. 
    norm = colors.Normalize(vmin,vmax, clip=False) 

    color_map = colors.ListedColormap(plt.cm.Greys(np.linspace(0.25, 1, 5)), "name") 

    im = ax.imshow(yv, cmap=color_map, norm=norm) 

pad = 0.03 
width = 0.03 

fig.canvas.draw() 
pos = ax2.get_position() 

ax3 = fig.add_axes([pos.xmax + pad, pos.ymin, width, 0.7*(pos.ymax-pos.ymin) ]) 
fig.colorbar(im, cax=ax3) 

plt.show() 

enter image description here

+0

あなたのコードをカットして貼り付けました。これは私が入手したものです。 [link](https://pasteboard.co/GLg3sw3.png) あなたのコードとはまったく異なっていますか? – user2078621

+0

私は分かりません。あなたはMacで働いていますか? – ImportanceOfBeingErnest

+0

はい私はMACを使用しています – user2078621

関連する問題