그래프 저장하기
차트를 완성했으니 이제 파일로 저장할 차례입니다.
"그냥 plt.savefig("chart.png")라고 하면 되지 않나요?"
"그렇긴 한데, 파일 형식이랑 해상도를 잘못 고르면 발표장에서 차트가 흐릿하게 보이거나, 논문 제출했더니 편집자가 해상도가 낮다고 반려하는 경우가 생겨. 용도에 맞는 설정을 알아두면 나중에 낭패를 안 봐."
plt.savefig() 기본 사용법
# 파일: savefig_basic.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_theme(style="whitegrid")fig, ax = plt.subplots(figsize=(8, 6))sns.boxplot(data=tips, x="day", y="total_bill", ax=ax)ax.set_title("요일별 총 금액")# 저장plt.savefig("chart.png")plt.show()
파일 이름의 확장자로 형식이 자동 결정됩니다. chart.png이면 PNG로, chart.pdf이면 PDF로 저장됩니다.
dpi: 해상도 설정
DPI(Dots Per Inch)는 인치당 픽셀 수입니다. 숫자가 클수록 선명하지만 파일 크기도 커집니다.
# 파일: savefig_dpi.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_theme(style="whitegrid")# 웹/화면용: 100 DPIfig, ax = plt.subplots(figsize=(8, 6))sns.boxplot(data=tips, x="day", y="total_bill", ax=ax)ax.set_title("요일별 총 금액")plt.savefig("chart_web.png", dpi=100)# 보고서/발표용: 150 DPIplt.savefig("chart_report.png", dpi=150)# 논문/인쇄용: 300 DPIplt.savefig("chart_print.png", dpi=300)plt.show()
| 용도 | 권장 DPI | 특징 |
|---|---|---|
| 화면/웹 | 72~100 | 파일 작음, 화면에서 충분히 선명 |
| 발표 슬라이드 | 150 | 프로젝터 출력에 적합 |
| 보고서 | 150~200 | A4 인쇄에 적합 |
| 논문 | 300 | 대부분의 학술지 요구 사항 |
| 포스터 | 300~600 | 대형 인쇄에 필요 |
bbox_inches="tight": 여백 자동 제거
차트 주변에 불필요한 여백이 생길 때 bbox_inches="tight"로 잘라냅니다.
# 파일: savefig_tight.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")g = sns.relplot( data=tips, x="total_bill", y="tip", col="time", hue="smoker", height=5)g.figure.suptitle("시간대별 팁 분포", y=1.03)# bbox_inches="tight": 제목 등이 잘리지 않게 자동 조정plt.savefig("relplot.png", dpi=150, bbox_inches="tight")plt.show()
suptitle처럼 Figure 전체에 걸린 제목은 일반 저장 시 잘릴 수 있습니다. bbox_inches="tight"가 그 문제를 해결합니다.
Figure-level 함수: g.savefig() 사용하기
relplot, pairplot, jointplot 같은 Figure-level 함수는 FacetGrid나 PairGrid 객체를 반환합니다. 이 객체의 .savefig() 메서드를 사용하면 자동으로 올바른 Figure를 저장합니다.
# 파일: figure_level_savefig.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# pairplot은 PairGrid 반환g = sns.pairplot(penguins, hue="species", corner=True)# g.savefig(): bbox_inches="tight"가 기본 적용됨g.savefig("pairplot.png", dpi=150)plt.show()
g.savefig()는 bbox_inches="tight"를 기본으로 포함하고 있어서 별도 지정이 필요 없습니다.
파일 형식 비교
| 형식 | 확장자 | 특징 | 언제 쓰나 |
|---|---|---|---|
| PNG | .png | 손실 없는 압축, 투명도 지원 | 웹, 발표 자료, 보고서 |
| 벡터 형식, 크기 변환에도 선명 | 논문 제출, 인쇄 | ||
| SVG | .svg | 벡터 형식, 웹에서 편집 가능 | 웹 게시, 디자인 도구 연동 |
| JPEG | .jpg | 손실 압축, 파일 크기 작음 | 사진과 결합할 때 |
| EPS | .eps | 벡터 형식, 오래된 논문 형식 | 일부 학술지 요구 |
# 파일: save_formats.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_theme(style="ticks", context="talk")fig, ax = plt.subplots(figsize=(8, 6))sns.boxplot(data=tips, x="day", y="total_bill", palette="colorblind", ax=ax)ax.set_title("요일별 총 금액")ax.set_xlabel("요일")ax.set_ylabel("총 금액 ($)")# PNG: 웹/발표 자료plt.savefig("chart.png", dpi=150, bbox_inches="tight")# PDF: 논문 (벡터, 크기 변환에도 선명)plt.savefig("chart.pdf", bbox_inches="tight")# SVG: 벡터 형식 (Illustrator, Inkscape 등에서 편집 가능)plt.savefig("chart.svg", bbox_inches="tight")plt.show()print("저장 완료: chart.png, chart.pdf, chart.svg")
transparent: 투명 배경으로 저장
PPT 슬라이드나 웹 배경에 차트를 올릴 때 배경이 투명한 PNG로 저장하면 유용합니다.
# 파일: savefig_transparent.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_theme(style="ticks")fig, ax = plt.subplots(figsize=(8, 6))sns.scatterplot(data=tips, x="total_bill", y="tip", ax=ax, alpha=0.6)ax.set_title("팁 데이터")# transparent=True: 배경을 투명하게plt.savefig( "chart_transparent.png", dpi=150, bbox_inches="tight", transparent=True)plt.show()
transparent=True는 PNG에서만 의미가 있습니다. PDF와 SVG는 기본적으로 투명 배경을 지원합니다.
facecolor: 배경색 지정
저장 시 배경색을 강제로 지정할 수 있습니다.
# 파일: savefig_facecolor.pyimport seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_theme(style="darkgrid")fig, ax = plt.subplots(figsize=(8, 6), facecolor="#1e1e2e") # 진한 배경ax.set_facecolor("#1e1e2e")sns.scatterplot(data=tips, x="total_bill", y="tip", ax=ax, color="cyan", alpha=0.7)ax.set_title("다크 테마 차트", color="white")ax.tick_params(colors="white")ax.xaxis.label.set_color("white")ax.yaxis.label.set_color("white")# facecolor="w": 흰 배경으로 저장 (Figure 배경색 덮어쓰기)# facecolor="auto": Figure의 facecolor 그대로 저장plt.savefig("chart_dark.png", dpi=150, bbox_inches="tight", facecolor="auto")plt.show()
발표용 차트 저장 완성 예시
민서가 팀 프로젝트 발표를 위해 최종 차트를 저장하는 코드입니다.
# 파일: final_save.pyimport seaborn as snsimport matplotlib.pyplot as plt# 발표용 설정sns.set_theme( style="ticks", context="talk", palette="colorblind", font_scale=1.1)penguins = sns.load_dataset("penguins")# 최종 차트 작성g = sns.pairplot( penguins, hue="species", diag_kind="kde", corner=True, plot_kws={"alpha": 0.5})g.figure.suptitle("펭귄 종별 신체 특징 비교", y=1.02, fontsize=16)# 발표 슬라이드용으로 저장 (PNG, 150 DPI)g.savefig("penguin_pairplot_presentation.png", dpi=150)# 보고서 제출용으로 저장 (PDF, 벡터)g.savefig("penguin_pairplot_report.pdf")print("저장 완료.")print(" 발표용: penguin_pairplot_presentation.png (150 DPI)")print(" 보고서용: penguin_pairplot_report.pdf (벡터)")
민서의 정리
발표 준비를 모두 마친 민서가 파일 두 개를 손에 들었습니다. 하나는 발표 슬라이드에 넣을 PNG, 하나는 제출용 보고서에 첨부할 PDF입니다.
"정리하면 이거네요.
- 웹이나 발표: PNG, 150 DPI, bbox_inches='tight'
- 논문이나 보고서: PDF 또는 300 DPI PNG
- Figure-level 차트: g.savefig()
- 배경 투명하게: transparent=True"
강주원 선배가 엄지를 들었습니다. "발표 잘 해봐. 차트가 내용을 반 이상 설명해줄 거야."
PART 03이 끝났습니다. 멀티플롯으로 여러 차트를 한 화면에 배치하고, 테마와 색상으로 분위기를 바꾸고, 주석으로 설명을 달고, 발표용과 보고서용으로 저장하는 전체 흐름을 익혔습니다. 다음 파트에서는 Pandas와 함께 실전 데이터를 다룹니다.