2017-12-04 21 views
1

matplotlib를 사용하여 그림을 만들었지 만 플롯 축과 그려진 선이 축소되었음을 알게되었습니다. enter image description heredpi와 그림 크기 사이의 관계

earlier discussion thread을 읽고 그림 크기를 설정하는 방법을 설명합니다.

fig, ax = plt.subplots()

fig.set_size_inches(3, 1.5)

위의 코드와

plt.savefig(file.jpeg, edgecolor='black', dpi=400, facecolor='black', transparent=True)

(다른 구성이 간결 제거), 내가해야 우리가 해상도가 너무 말 (1200 X 600 원하는 크기로 결과 이미지 파일을받을 수 있나요 ?) 및 원하는 파일 크기.

영사 이미지가 비정상적으로 스케일 아웃되고, 예를 들어 주석이 확대됩니다. 축에 레이블의 크기를 설정할 수는 있지만 아래쪽 및 오른쪽 등뼈가 여전히 크고 그림이 그려져 있기 때문에 그림은 여전히 ​​축척에 비례하여 보입니다.

문제는 무엇이 문제입니까, 어떤 구성이 잘못된 것입니까?

+0

꽤 문제를 이해하지 않습니다. 하지만 내가 말할 수있는 것은 그림 크기가 인치 *와 * dpi로 고정되어야한다는 것입니다. "너무 큼"으로 인식하는 개체의 크기를 변경해야합니다. 즉 글꼴 크기, 선 너비, 눈금 표시 등을 설정해야합니다. 등등. 대개 dpi * 또는 * 크기를 인치로 수정하여 원하는 그림을 얻습니다. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest 원하는 치수로 밝혀졌으며 파일 크기가 원하는 범위 내에있는 그림을 만들었습니다. 그러나 그려진 그래프는 너무 확대/축소 된 것으로 판명되었습니다. 재생할 수있는 크기 조정 및 종횡비 문제가있는 것으로 보이는 다른 스레드를 읽습니다. 이전에 설정 한 figsize() 및 dpi 매개 변수와 관련하여 캔버스의 모든 요소를 ​​자동으로 조정하는 방법이 있어야한다고 생각하기 때문에 각 요소 크기를 선언하라는 제안은 다소 이상합니다. – Dennis

+0

다시 시도해보십시오. 픽셀 크기는'1200 X 600'이고, 일반적으로 크기가'(12 x 6)'와 100 dpi 인 그림을 만들 것입니다.이 경우 선의 크기는 적절할 것입니다. 대신 400 dpi를 사용하면 그림의 각 점이 4 배로 커집니다. 분명히 그것은 당신이 원하는 것이 아닙니다. 하지만 필요한 경우 요소를 축소 할 수 있습니다 (예 : 1 대신 0.25). (스케일링이나 aspect 문제는 ​​여기에 없으며, 이것이 어떻게 작동하고 예상대로일까요.) – ImportanceOfBeingErnest

답변

2

그림 크기 (figsize)은 그림의 크기를 인치 단위로 결정합니다. 이것은 축 (및 다른 요소)이 그림 안에있는 공간의 양을 나타냅니다. 기본 그림 크기는 matplotlib 2의 경우 (6.4, 4.8) 인치입니다. 그림 크기가 클수록 더 긴 텍스트, 더 많은 축 또는 더 많은 ticklabel이 표시됩니다.

도트 수 (dpi)은 그림이 구성하는 픽셀 수를 결정합니다. 하기 matplotlib의 기본 dpi로는 figsize=(w,h)의도 그래서 예를 들면 화소의 크기의 도면을 얻기 위해서

px, py = w*dpi, h*dpi # pixels 
# e.g. 
# 6.4 inches * 100 dpi = 640 pixels 

있을 것이다 100 인 (1200,600) 그림 크기와 dpi의 조합을 여러 개 선택할 수 있습니다 (예 :

figsize=(15,7.5), dpi= 80 
figsize=(12,6) , dpi=100 
figsize=(8,4) , dpi=150 
figsize=(6,3) , dpi=200 
etc. 

이제 차이점은 무엇입니까? 이것은 그림 안의 요소의 크기에 의해 결정됩니다. 선, 마커, 텍스트와 같은 대부분의 요소는 점으로 주어진 크기를가집니다.
Matplotlib 숫자는 점 (ppi)의 72를 사용합니다. 두께 1 포인트의 선은 1.72입니다. 인치 와이드. 글꼴 크기가 12 포인트 인 텍스트는 12./72가됩니다. 인치 heigh.

물론 그림 크기를 인치로 변경하면 점은 변경되지 않으므로 인치의 큰 그림은 여전히 ​​요소 크기가 동일합니다. 따라서 그림 크기를 변경하는 것은 다른 크기의 종이를 찍는 것과 같습니다. 이렇게하면 동일한 펜으로 그려지는 선의 너비는 변경되지 않습니다.

반면에 dpi를 변경하면 해당 요소가 조정됩니다. 72 dpi에서 1 포인트 크기의 선은 1 픽셀 강합니다. 144 dpi에서이 선은 2 픽셀 강합니다. 따라서 더 큰 dpi는 돋보기처럼 작동합니다. 모든 요소는 렌즈의 배율에 따라 조정됩니다.

일정한 그림 크기와 다양한 dpi에 대한 비교는 왼쪽 아래 이미지에 나와 있습니다. 오른쪽에서 일정한 dpi와 다양한 그림 크기를 볼 수 있습니다. 각 행의 숫자는 동일한 픽셀 크기입니다.

enter image description here

코드 재현 :

import matplotlib.pyplot as plt 
%matplotlib inline 

def plot(fs,dpi): 
    fig, ax=plt.subplots(figsize=fs, dpi=dpi) 
    ax.set_title("Figsize: {}, dpi: {}".format(fs,dpi)) 
    ax.plot([2,4,1,5], label="Label") 
    ax.legend() 

figsize=(2,2) 
for i in range(1,4): 
    plot(figsize, i*72) 

dpi=72 
for i in [2,4,6]: 
    plot((i,i), dpi) 
+0

그에 따라 잘 표시 및 표시됩니다. – Dennis