source

그래프와 일치하도록 Matplotlib 색상 막대 크기 설정

goodcode 2022. 11. 5. 11:37
반응형

그래프와 일치하도록 Matplotlib 색상 막대 크기 설정

포토샵을 사용하는 것 외에는 이 그래프와 같은 높이로 이 그래프에 있는 컬러바를 얻을 수 없습니다.떻게게 높이 ?? ???색상 막대 크기 불일치 예제

이 조합(및 이와 가까운 값)은 디스플레이 크기에 관계없이 컬러바의 크기를 플롯에 맞게 조정하기 위해 마법처럼 기능하는 것 같습니다.

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

또한 그래프를 정사각형으로 만들 수 있는 축을 공유할 필요도 없습니다.

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)

여기에 이미지 설명 입력

이치노로 </FONT CHANGE:/FONT CHANGE:/FONT CHANGE:/FONT CHANGE:>는axes_grid1은 GeoAx를 할 수 GeoAx를 조정합니다.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)

결과

여기에 이미지 설명 입력

나중에, 는 공식 문서가 또한 다음과 같은 정보를 제공한다는 것을 알게 되었다.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)

결과

여기에 이미지 설명 입력

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

그림 너비와 대조적으로 플롯 높이를 나타내는 색상 막대의 너비를 지정합니다.

색상 막대와 플롯 사이의 간격을 색상 막대의 폭의 비율로 지정할 수 있습니다. 색상 막대의 폭은 그림 폭의 일부보다 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)

작성 시colorbarfraction 및/또는 shrink 매개 변수를 사용해 보십시오.

문서에서:

분율 0.15; 색상 막대에 사용할 원래 축의 분율

1.0 축소, 컬러바를 축소하는 분수

위의 솔루션들은 모두 좋지만, 저는 @Steve's와 @bejota's가 가장 좋습니다.그것들은 화려한 콜을 수반하지 않고 보편적이기 때문입니다.

범용이란 다음을 포함한 모든 유형의 축에서 작동한다는 뜻입니다.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의 비율로 작업하면 최적의 크기를 얻을 수 있습니다.그러나 그림에 가장 적합하도록 분수와 패디지 값을 조정해야 하며 색상 막대의 방향이 수직 위치인지 수평 위치인지에 따라 달라집니다.

또 다른 방법은

shrink=0.7, aspect=20*0.7

shrink높이와 폭의 축척을 조정하지만aspect인수를 지정하면 원래 너비가 복원됩니다.기본 석면비는 20입니다.0.7경험적으로 결정된다는 거죠.

다른 축 세트를 선언하고 싶지 않다면, 내가 찾은 가장 간단한 해결책은 그림 크기를 그림 크기 호출로 변경하는 것입니다.

위의 예에서는 먼저 다음과 같이 시작합니다.

fig = plt.figure(figsize = (12,6))

색 막대가 더 이상 주요 플롯을 축소하지 않을 때까지 다른 비율로 재작성합니다.

언급URL : https://stackoverflow.com/questions/18195758/set-matplotlib-colorbar-size-to-match-graph

반응형