Imshow : 범위 및 측면


85

저는 3D 데이터 세트를 통해 슬라이스와 투영을 시각화하는 소프트웨어 시스템을 작성하고 있습니다. 저는 matplotlib특히 imshow분석 코드에서 얻은 이미지 버퍼를 시각화하기 위해 사용 하고 있습니다.

플롯 축으로 이미지에 주석을 달고 싶기 때문에 imshow이미지 버퍼 픽셀 좌표를 데이터 공간 좌표계에 매핑 하는 데 제공 하는 범위 키워드를 사용합니다 .

불행히도, matplotlib단위에 대해 모릅니다. (인공적인 예를 들어) 치수가 1000 m X 1 km. 이 경우 범위는 [0, 1000, 0, 1]. 이미지 배열이 정사각형이지만 Extent 키워드가 암시하는 종횡비가 1000이므로 결과 플롯 축도 종횡비가 1000입니다.

범위 키워드를 사용하여 자동으로 생성 된 주요 눈금 및 레이블을 유지하면서 플롯의 종횡비를 강제 할 수 있습니까?

답변:


141

이미지의 측면을 수동으로 설정하거나 그림의 범위를 채우기 위해 자동 크기 조정을 허용하여 수행 할 수 있습니다.

기본적으로 imshow플롯의 측면을 1로 설정합니다. 이는 종종 사람들이 이미지 데이터에 대해 원하는 것입니다.

귀하의 경우 다음과 같이 할 수 있습니다.

import matplotlib.pyplot as plt
import numpy as np

grid = np.random.random((10,10))

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(6,10))

ax1.imshow(grid, extent=[0,100,0,1])
ax1.set_title('Default')

ax2.imshow(grid, extent=[0,100,0,1], aspect='auto')
ax2.set_title('Auto-scaled Aspect')

ax3.imshow(grid, extent=[0,100,0,1], aspect=100)
ax3.set_title('Manually Set Aspect')

plt.tight_layout()
plt.show()

여기에 이미지 설명 입력


감사. 재미 있은 문서는 scalar옵션 에 대해 아무것도 말하지 않습니다 . y-axis주어진 스칼라 로 크기를 조정하는 것으로 보입니다 .
orodbhen

@JoeKington은 개별 픽셀의 크기를 얻을 수 있습니다. 이 크기는 데이터 세트의 크기에 따라 다르며 귀하의 경우와 같이 연속적인 플롯으로 타일 패치 워크를 형성 할 수 있습니다.
Alexander Cska

4

에서 plt.imshow()공식 가이드, 우리는 화면 제어를 축의 화면 비율을 알고있다. 제 말로, aspect는 정확히 x 단위 와 y 단위 의 비율입니다 . 대부분의 경우 우리는 의도하지 않게 수치를 왜곡하지 않기 때문에 1로 유지하고 싶습니다. 그러나 실제로 1이 아닌 다른 값을 aspect를 지정해야하는 경우가 있습니다. 질문자는 x 및 y 축이 다른 물리적 단위를 가질 수 있다는 좋은 예를 제공했습니다. x는 km, y는 m이라고 가정 해 보겠습니다. 따라서 10x10 데이터의 경우 범위는 [0,10km, 0,10m] = [0, 10000m, 0, 10m]이어야합니다. 이 경우 기본 aspect = 1을 계속 사용하면 그림의 품질이 정말 나빠집니다. 따라서 그림을 최적화하기 위해 aspect = 1000을 지정할 수 있습니다. 다음 코드는이 방법을 보여줍니다.

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
rng=np.random.RandomState(0)
data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 10000, 0, 10], aspect = 1000)

여기에 이미지 설명 입력

그럼에도 불구하고 질문자의 요구에 부응 할 수있는 대안이 있다고 생각합니다. 범위를 [0,10,0,10]으로 설정하고 추가 xy 축 레이블을 추가하여 단위를 표시 할 수 있습니다. 다음과 같이 코드.

plt.imshow(data, origin = 'lower',  extent = [0, 10, 0, 10])
plt.xlabel('km')
plt.ylabel('m')

여기에 이미지 설명 입력

만들기 위해 정확한 그림 항상 x_max-x_min = x_res * data.shape[1]그리고 y_max - y_min = y_res * data.shape[0], where extent = [x_min, x_max, y_min, y_max]. 기본적으로 aspect = 1는 단위 픽셀이 정사각형임을 의미합니다. 이 기본 동작은 값이 다른 x_res 및 y_res에서도 잘 작동합니다. 이전 예제를 확장하여 x_res는 1.5이고 y_res는 1이라고 가정합니다. 따라서 범위는 [0,15,0,10]과 같아야합니다. 기본 측면을 사용하면 직사각형 색상 픽셀을 사용할 수 있지만 단위 픽셀은 여전히 ​​정사각형입니다!

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10])
# Or we have similar x_max and y_max but different data.shape, leading to different color pixel res.
data=rng.randn(10,5)
plt.imshow(data, origin = 'lower',  extent = [0, 5, 0, 5])

여기에 이미지 설명 입력 여기에 이미지 설명 입력

컬러 픽셀의 측면은 x_res / y_res. 측면을 단위 픽셀의 측면으로 설정하면 (즉 aspect = x_res / y_res = ((x_max - x_min) / data.shape[1]) / ((y_max - y_min) / data.shape[0])) 항상 정사각형 색상 픽셀이 제공됩니다. aspect = 1.5를 변경하여 x 축 단위가 y 축 단위의 1.5 배가되도록 정사각형 컬러 픽셀과 정사각형 전체 도형이지만 직사각형 픽셀 단위가되도록 할 수 있습니다. 분명히 일반적으로 허용되지 않습니다.

data=rng.randn(10,10)
plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.5)

여기에 이미지 설명 입력

가장 바람직하지 않은 경우는 aspect를 1.2와 같은 임의의 값으로 설정하여 정사각형 단위 픽셀이나 정사각형 색상 픽셀이되지 않는 경우입니다.

plt.imshow(data, origin = 'lower',  extent = [0, 15, 0, 10], aspect = 1.2)

여기에 이미지 설명 입력

간단히 말해서, 올바른 범위를 설정하고 matplotlib가 나머지 작업을 수행하도록하는 것으로 충분합니다 (x_res! = y_res에도 불구하고)! 꼭 필요한 경우에만 측면을 변경하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.