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

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



답변

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)

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


답변

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

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

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


답변

@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)


답변

위의 모든 답변에 감사드립니다. 일부 답변과 의견이 지적처럼 그러나 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)

결과

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


답변

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

문서에서 :

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

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


답변

위의 모든 솔루션은 훌륭하지만 @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 사이의 분수를 사용하여 최상의 크기를 얻으십시오. 그러나 플롯에 가장 잘 맞도록 분수와 패드의 값을 조정해야하며 색상 막대의 방향이 수직 위치인지 수평인지에 따라 달라집니다.


답변