그림 저장은 fig.savefig("out.png", dpi=..., bbox_inches="tight", transparent=...) 한 줄이지만, 결과 품질은 figsize(인치 단위 크기)와 dpi(인치당 픽셀)의 곱으로 정해지는 최종 픽셀 수, 그리고 파일 포맷 선택에 달려 있습니다.
래스터 포맷(PNG)은 픽셀 고정, 벡터 포맷(SVG·PDF)은 무한 확대가 가능하므로 용도가 다릅니다.
창을 띄우는 인터랙티브 백엔드와 파일만 만드는 비인터랙티브(Agg) 백엔드의 차이도 저장 흐름에 영향을 줍니다.
import matplotlib
import matplotlib.pyplot as pltfigsize와 dpi의 관계figsize=(w, h)는 인치 단위 크기입니다. plt.subplots(figsize=(6, 4)) → 6인치 × 4인치.dpi는 인치당 픽셀 수입니다.figsize × dpi. 예: (6, 4) × 150 = 900 × 600 px.fig, ax = plt.subplots(figsize=(6, 4)) # 물리 크기
fig.savefig("plot.png", dpi=150) # 해상도 → 900x600 px
fig.savefig("plot@2x.png", dpi=300) # 같은 그림, 1800x1200 pxdpi(figure.dpi)와 저장용 dpi(savefig.dpi)는 별개입니다. savefig(dpi=...)가 저장 시점 값을 덮어씁니다.figsize에 상대적입니다. figsize를 키우지 않고 dpi만 올리면 픽셀은 늘지만 글자 비율은 그대로입니다. 반대로 figsize를 줄이면 상대적으로 글자가 커 보입니다.💡 이럴 때: 논문·슬라이드에 넣을 그림은 목표 물리 크기를
figsize로 먼저 정하고(예: 2단 칼럼 폭 3.5인치),dpi=300으로 저장합니다. 나중에 이미지를 키우고 줄이지 않습니다.
💡 이럴 때: 글자가 너무 작으면 dpi가 아니라 figsize를 줄이거나 font.size를 키웁니다.
fig.savefig 주요 인자fig.savefig(
"report.png",
dpi=300,
bbox_inches="tight", # 여백을 잘라 내용에 딱 맞게 (라벨 잘림 방지)
pad_inches=0.05, # tight일 때 남길 여백
transparent=True, # 배경을 투명하게 (슬라이드·웹 오버레이용)
facecolor="white", # 배경색 명시 (transparent=False일 때)
)plt.savefig(...)(pyplot)는 "현재 Figure"를 저장합니다. OO에서는 fig.savefig(...)로 대상을 명확히 합니다.plt.close(fig)로 메모리를 해제합니다(루프에서 그림을 대량 생성할 때 특히 중요).fig.savefig("fig.pdf") # 벡터, 논문용
fig.savefig("fig.svg") # 벡터, 웹/편집
fig.savefig("fig.png", dpi=200) # 래스터, 범용💡 이럴 때: 산점도에 점이 10만 개가 넘으면 SVG/PDF가 수 MB로 커지고 뷰어가 느려집니다. 이럴 때는 PNG(고 dpi)로 저장하거나,
ax.scatter(..., rasterized=True)로 그 요소만 래스터화하고 축·텍스트는 벡터로 유지합니다.
논의 계층을 나눕니다. 백엔드는 "렌더링 대상"에 따라 두 부류입니다.
matplotlib.use("Agg") # pyplot import 전에 호출해야 확실히 적용
import matplotlib.pyplot as plt
print(matplotlib.get_backend()) # 현재 백엔드Agg가 자동 선택되며, 그림은 오직 savefig로만 얻습니다.Agg는 "Anti-Grain Geometry"의 약자로, 대부분의 인터랙티브 백엔드도 실제 픽셀 렌더링은 Agg 엔진을 씁니다(그래서 QtAgg, TkAgg처럼 이름에 Agg가 붙습니다).inline(정적 PNG/SVG) 또는 ipympl/widget(인터랙티브)을 씁니다. %matplotlib inline / %matplotlib widget 매직으로 전환합니다.💡 이럴 때: 리눅스 서버에서
plt.show()호출 시no display name류의 에러나 멈춤이 나면, 스크립트 최상단에서matplotlib.use("Agg")를 지정하고 표시 대신 저장하도록 바꿉니다.
💡 이럴 때: 배치로 그림 수백 장을 생성하면 메모리가 계속 쌓입니다. 각 그림 저장 후 plt.close(fig)를 반드시 호출합니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.