2017-04-09 3 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() 

그리드의 서브 플로트 중 하나의 위치와 정확히 일치시키는 새 색상 막대는 어떻게 만듭니 까? 나는 적어도 축소와 앵커를 사용하여 크기와 y 위치를 고치지 만 ... 그러나 서브 도표 사이의 패딩을 고려하면 사각형이 아닌 직사각형 인 경우 조금 복잡해집니다.

enter image description here

+0

달성하고자하는 것이 분명하지 않습니다. "새로운 색상 막대를 그리드의 서브 그림 중 하나의 위치와 정확하게 일치 시키십시오"라는 문장은 여러 가지 다른 방식으로 해석 될 수 있습니다. 나는 당신이 보여주는 줄거리에 무엇이 잘못된지를 명확하게 기술하는 것이 더 낫다고 생각합니다. 왼쪽의 컬러 바를 사용하여 원하는 위치에 있습니까? 올바른 컬러 바를 어디에 앉으시겠습니까? 어떤 직책에 맞추고 싶습니까? 정확히 일치한다는 것은 그것이 사각형 모양을 가지고 있음을 암시합니다. 이게 니가 원하는거야? 얼마나 많은 컬러 바가 필요합니까? – ImportanceOfBeingErnest

+0

왼쪽에 하나의 컬러 바를 갖고 싶습니다. 그리고 왼쪽에있는 것과 같은 방식으로 오른쪽에 다른 것을 하나 갖고 싶습니다 - 하위 그림 중 하나에 맞추십시오. 그것의 꼭대기에 있지는 않지만 지금은 그렇듯이 옆에 있습니다. – Phlya

+0

AxesGrid를 사용하는 좋은 해결책이 없다고 생각합니다. 플롯의 한면에만 하위 그림 만 허용하기 때문입니다. AxesGrid를 사용하고자하는 이유는 그 사이의 간격을 피하기 위해서라고 생각합니다. 그러나 AxesGrid 사용 요구 사항을 삭제할 수 있다면 일반적인 서브 플로트를 사용할 수 있습니다. – ImportanceOfBeingErnest

답변

2

하나의 옵션은 축 중 하나의 위치에 따라 수동으로 색상 막대 축을 배치하는 것입니다. 이를 위해 먼저 캔버스를 그려야 포지션을 알 수 있습니다. 그런 다음 이미지 플롯의 좌표에 따라 새 축을 만들 수 있습니다. 이 새로운 축은 컬러 막대 축으로 사용됩니다.

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

이 방법은, 도면에서의 축 위치에 일단이 변화, 예를 들어 의존 피규어가 rezised 때문에, unforseable 일이 일어날 수 있습니다.

다른 방법은 그려진 좌표에 의존하지 않고 삽입 된 축을 사용하여 축 외부에 삽입하는 것입니다. 이 방법으로 인세 트가 위치한 좌표는 축 좌표이므로 색상 막대는 축에 따라 위치가 변경됩니다.

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

관련 문제