Matplotlib 컬러 바 크기를 그래프와 일치하도록 설정


161

이 같은 imshow 그래프의 색상 막대를 그래프와 동일한 높이로 만들 수는 없습니다. 사실 후에 Photoshop을 사용하지 않는 것입니다. 높이를 맞추려면 어떻게해야합니까?컬러 바 크기 불일치의 예



@ imjohns3 그 포스트의 어떤 것도 컬러 바에 아무것도하지 않는 것 같습니다. 내가 설정 한 내용에 관계없이 동일한 크기를 유지합니다. 그래도 분수를 설정하고 축소하면 색상 막대가 그대로 유지되는 동안 그래프의 크기가 변경됩니다.
Elliot

matplotlib.org/api/colorbar_api.html 문서를 확인 하고 사용 fraction또는 shrink인수를 사용하십시오 .
BoltzmannBrain

답변:


194

matplotlib AxisDivider를 사용하면이 작업을 쉽게 수행 할 수 있습니다 .

연결된 페이지의 예제는 하위 플롯을 사용하지 않고 작동합니다.

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

plt.figure()
ax = plt.gca()
im = ax.imshow(np.arange(100).reshape((10,10)))

# create an axes on the right side of ax. The width of cax will be 5%
# of ax and the padding between cax and ax will be fixed at 0.05 inch.
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)

plt.colorbar(im, cax=cax)

여기에 이미지 설명을 입력하십시오


1
서브 플롯 내부에서 작업하고 있지 않으므로 적용 할 수 없습니다.
Elliot

많은 땜질 후, 작동하도록했습니다. subplot_adjust와 상호 작용하는 데 많은 문제가 있으므로 서로에 대해 적절한 장소에서 전화를 받아야합니다.
Elliot

11
이것은 그래프의 크기를 약간 변경하고 있습니다. 2x2 그리드에 4가 있지만 오른쪽에 2 개만 막대가 있어야합니다 (스케일은 행별로 적용됨). 그러나 이것은 같은 크기가 아닙니다. 컬러 바 호출 (디바이더 호출)을 사용하지 않으려 고 시도했지만 물론 이것은 빈 흰색 상자와 숫자를 옆에 둡니다. 그들 모두에 막대를 붙이지 않고 일관된 크기를 갖도록하려면 어떻게해야합니까?
Elliot

@bogatron 불행히도 이것은 투영 된 축에서 작동하지 않습니다
Bogdan

을 사용하여 타이틀을 추가 plt.title하려면 오른쪽으로 교체되어 표시됩니다. 이것을 극복 할 수있는 방법이 있습니까?
user2820579

224

이 조합 (및이 값에 가까운 값)은 디스플레이의 크기에 관계없이 컬러 막대를 플롯에 맞게 유지하는 데 "마 법적으로"작동하는 것 같습니다.

plt.colorbar(im,fraction=0.046, pad=0.04)

또한 플롯을 사각형에서 벗어날 수있는 축을 공유 할 필요가 없습니다.


4
경우에 따라 작동하지만 일반적으로 작동하지 않습니다. 예를 들어, 원래 질문에서와 같이 너비가 높이의 두 배인 것을 그려보십시오.
Matthias

분수 옵션은 플롯의 높이와 일치하도록 축척 된 경우 언급 한 경우 여전히 작동하는 것 같습니다. (mpl v1.4.3)
skytaker

6
이것이 유일한 보편적 인 방법입니다. axex_grid1이있는 솔루션은 GeoAxes와 같은 투영 된 축에는 작동하지 않습니다.
Bogdan

세상에 이것은 대단하다. 솔루션에 대해 대단히 감사합니다
2D_

3
@Matthias 의견에 대한 답변. 이 트릭을 사용하여 이미지가 너무 넓은 경우를 수정할 수 있습니다. 이미지는 im_ratio = data.shape[0]/data.shape[1] plt.colorbar(im,fraction=0.046*im_ratio, pad=0.04)어디에 있습니까 data?
eindzl

30

@bogatron은 이미 올바른 높이를 생성하는 matplotlib docs 에서 제안한 답변을 제공 했지만 다른 문제가 발생합니다. 이제 색상 막대의 너비와 색상 막대와 플롯 사이의 간격이 플롯 너비에 따라 변경됩니다. 즉, 컬러 바의 종횡비가 더 이상 고정되지 않습니다.

올바른 높이 주어진 종횡비를 모두 얻으려면 신비한 axes_grid1모듈을 조금 더 깊이 파고 들어야 합니다.

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

aspect = 20
pad_fraction = 0.5

ax = plt.gca()
im = ax.imshow(np.arange(200).reshape((20, 10)))
divider = make_axes_locatable(ax)
width = axes_size.AxesY(ax, aspect=1./aspect)
pad = axes_size.Fraction(pad_fraction, width)
cax = divider.append_axes("right", size=width, pad=pad)
plt.colorbar(im, cax=cax)

이 지정은 유의 년 Colorbar의 WRT는 높이 받는 대조 (줄거리를 은 전과 같이, 도면 중).

컬러 바와 플롯 사이의 간격은 이제 컬러 바 너비의 분수로 지정할 수 있습니다. 이는 IMHO가 그림 너비의 분수보다 훨씬 더 의미있는 숫자입니다.

컬러 바가있는 이미지 플롯

최신 정보:

주제 에서 IPython 노트북을 만들었습니다 . 여기서 위 코드를 쉽게 재사용 가능한 함수로 압축했습니다.

import matplotlib.pyplot as plt
from mpl_toolkits import axes_grid1

def add_colorbar(im, aspect=20, pad_fraction=0.5, **kwargs):
    """Add a vertical color bar to an image plot."""
    divider = axes_grid1.make_axes_locatable(im.axes)
    width = axes_grid1.axes_size.AxesY(im.axes, aspect=1./aspect)
    pad = axes_grid1.axes_size.Fraction(pad_fraction, width)
    current_ax = plt.gca()
    cax = divider.append_axes("right", size=width, pad=pad)
    plt.sca(current_ax)
    return im.axes.figure.colorbar(im, cax=cax, **kwargs)

다음과 같이 사용할 수 있습니다 :

im = plt.imshow(np.arange(200).reshape((20, 10)))
add_colorbar(im)

1
이것은 정말 유용한 작은 기능입니다! 경고의 한 단어는 여러 색상 막대를 서로 추가하려고 할 때 작동하지 않는다는 것입니다.
David Hall

22

위의 모든 답변에 감사드립니다. 일부 답변과 의견이 지적처럼 그러나 axes_grid1모듈은 주소 GeoAxes은 조정 반면 수 없습니다 fraction, pad, shrink, 및 기타 유사한 매개 변수는 반드시 정말 날 귀찮게 매우 정확한 순서를 줄 수 없다. 나는주고 있다고 생각 colorbar자체 것은 axes언급 된 모든 문제를 해결하기 위해 더 나은 해결책이 될 수 있습니다.

암호

import matplotlib.pyplot as plt
import numpy as np

fig=plt.figure()
ax = plt.axes()
im = ax.imshow(np.arange(100).reshape((10,10)))

# Create an axes for colorbar. The position of the axes is calculated based on the position of ax.
# You can change 0.01 to adjust the distance between the main image and the colorbar.
# You can change 0.02 to adjust the width of the colorbar.
# This practice is universal for both subplots and GeoAxes.

cax = fig.add_axes([ax.get_position().x1+0.01,ax.get_position().y0,0.02,ax.get_position().height])
plt.colorbar(im, cax=cax) # Similar to fig.colorbar(im, cax = cax)

결과

여기에 이미지 설명을 입력하십시오

나중에 matplotlib.pyplot.colorbar공식 문서 도 제공합니다.ax 색상 막대를위한 공간을 제공하는 기존 축인 옵션이 있습니다. 따라서 여러 서브 플롯에 유용합니다 (다음 참조).

암호

fig, ax = plt.subplots(2,1,figsize=(12,8)) # Caution, figsize will also influence positions.
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
fig.colorbar(im1, ax=ax)

결과

여기에 이미지 설명을 입력하십시오

다시 말하지만, 내 관점에서보다 정확한 방법 인 cax를 지정하여 비슷한 효과를 얻을 수도 있습니다.

암호

fig, ax = plt.subplots(2,1,figsize=(12,8))
im1 = ax[0].imshow(np.arange(100).reshape((10,10)), vmin = -100, vmax =100)
im2 = ax[1].imshow(np.arange(-100,0).reshape((10,10)), vmin = -100, vmax =100)
cax = fig.add_axes([ax[1].get_position().x1-0.25,ax[1].get_position().y0,0.02,ax[0].get_position().y1-ax[1].get_position().y0])
fig.colorbar(im1, cax=cax)

결과

여기에 이미지 설명을 입력하십시오


@ HS- 성운 의견에 감사드립니다. :)
Fei Yao

정말 놀라운 답변입니다. 감사합니다!!
episodeyang

11

colorbar분수 및 / 또는 수축 매개 변수 를 사용하여 시험 을 작성할 때 .

문서에서 :

분획 0.15; 컬러 바에 사용할 원래 축의 비율

수축 1.0; 컬러 바를 축소시키는 분수


1
축소 1.0과 분수를 다른 것으로 설정하면 분수를 변경하면 분수가 변경되어 이미 가지고있는 것이 될 때까지 그래프가 축소되고 아무것도 변경하지 않아도됩니다.
Elliot

정확하게 지정하는 위치는 colorbar()함수 또는 메소드 에 대한 매개 변수 여야 합니다.
Steve Barnes

감사. 수축 매개 변수를 지정하면 마술처럼 작동합니다!
CodingNow

11

위의 모든 솔루션은 훌륭하지만 @Steve와 @bejota가 가장 좋습니다. 멋진 전화를하지 않고 보편적입니다.

보편적으로 나는를 포함하여 모든 유형의 축에서 작동한다는 것을 의미합니다 GeoAxes. 예를 들어, 매핑 할 축을 투영했습니다.

projection = cartopy.crs.UTM(zone='17N')
ax = plt.axes(projection=projection)
im = ax.imshow(np.arange(200).reshape((20, 10)))

에 전화

cax = divider.append_axes("right", size=width, pad=pad)

실패합니다 : KeyException: map_projection

따라서 모든 유형의 축에 컬러 바 크기를 처리하는 유일한 보편적 방법은 다음과 같습니다.

ax.colorbar(im, fraction=0.046, pad=0.04)

0.035에서 0.046 사이의 분수를 사용하여 최상의 크기를 얻으십시오. 그러나 플롯에 가장 잘 맞도록 분수와 패드의 값을 조정해야하며 색상 막대의 방향이 수직 위치인지 수평인지에 따라 달라집니다.


1
우리는 또한 추가 할 shrink때 매개 변수 fraction와 함께 pad충분히 원하는 결과를 생성하지 않습니다.
Fei Yao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.