2017-09-20 3 views
0

내 플롯의 색상 막대를 사용자 정의 높이로 설정하고 싶습니다. 반드시 플롯의 크기와 일치시킬 필요는 없습니다. 사실 나는 그림의 높이와 일치시키기 위해 그것의 위에 제목을 더한 colorbar의 높이를 원합니다. 나는 많은 시간을 요구 된 플롯과 동일한 높이로 년 Colorbar을 가지고 관리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이라는 축을 명시 적으로 부여하기로 결정했습니다. 여기 내가하려는 일이 있습니다. 데이터와이 예에서는 어떤 년 Colorbar은 내가 예상 결과를받지 못했습니다 것을 보여주기 위해,이 없습니다 :

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 잘못된 BoundingBox의를 반환?

+0

이유는 더 이상이 질문에 commenta과 답변을 볼 수 없습니다? – user2078621

+0

답변을 제공 한 사용자가 문제를 해결하지 못했기 때문에 답변을 삭제했습니다. 실제 문제에 관해서는, 당신의 플롯이 어떻게 보일 것인가에 대해 더 자세히 알고 싶을 것입니다. (또한 어떤 종류의 그림을 보여 주느냐에 따라 달라집니다. 즉, 가로 세로 비율이 같은지 여부입니다.) – ImportanceOfBeingErnest

답변

1

.get_position()에서 실제 위치를 가져 오기 전에 캔버스를 그립니다. 이는 동일한 종횡비로 인하여 드로잉시 축이 크기와 위치를 변경하기 때문입니다.

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

코드를 잘라내어 붙여 넣은 것입니다. [링크] (https://pasteboard.co/GLg3sw3.png) 어떻게 당신과 완전히 다를 수 있습니까? – user2078621

+0

나는 잘 모른다. 맥에서 일하고 있니? – ImportanceOfBeingErnest

+0

예 Mac을 사용하고 있습니다 – user2078621

관련 문제