슬라이드·리포트는 여전히 차트 PNG로 납품됩니다. 본문은 Matplotlib·Plotly 2026 매트릭스, 복붙 수출 파라미터(dpi·figsize·transparent·MPLBACKEND·write_image/Kaleido·Pillow save), sRGB 검수 표, 원격 M4의 ~/png_jobs/viz_export 배치·게이트를 표 중심으로 정리합니다.
① 결정 매트릭스: PNG 납품에 Matplotlib vs Plotly
스타일을 코드로만 고정하면 Matplotlib, 대시보드와 동일 Figure의 정적 PNG면 Plotly가 흔합니다.
| 항목 | Matplotlib | Plotly |
|---|---|---|
| 헤드리스·서버 배치 | 우수 — MPLBACKEND=Agg 또는 matplotlib.use("Agg")를 pyplot import 전에 설정 |
우수 — kaleido 설치 후 fig.write_image("out.png") |
| 픽셀 크기 모델 | figsize(인치)×savefig(dpi=…)로 근사 캔버스; bbox_inches="tight"는 여백·레이블 클리핑 주의 |
논리 width/height(px) + scale(레티나 배율) |
| 투명 배경 | transparent=True와 facecolor/edgecolor; 암배경에서 안티앨리어싱 프린지 확인 |
레이아웃에서 paper/plot 배경을 rgba(0,0,0,0); Kaleido 결과를 #000/#FFF 플레이트에 검증 |
| 인터랙션 vs 정적 | 정적 우선·인쇄형 스펙에 적합 | Dash와 동일 Figure; 스냅샷 시 카메라·호버 상태 주의 |
| 대표 리스크 | 폰트 미탐지·굵기 폴백·타이트 bbox로 축 라벨 잘림 | Kaleido·plotly 버전 드리프트·대용량 WebGL 트레이스의 래스터 비대화 |
② 실행 파라미터(복붙)
원격 M4에서는 LaunchAgent·CI와 동일 사용자로 폰트 캐시를 맞추세요.
Matplotlib — Agg, dpi, 투명
figsize[0] * dpi(과도한 tight 크롭 없을 때). 수출 후 sips -g pixelWidth 또는 Pillow로 재측정하세요.
# 셸: 배치 잡에서 비대화형 백엔드 고정
export MPLBACKEND=Agg
# Python
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 5.625), layout="constrained") # 약 16:9 인치 캔버스
ax.plot([0, 1], [0, 1])
fig.savefig(
"out/matplotlib_chart.png",
dpi=300,
transparent=True,
facecolor="none",
edgecolor="none",
bbox_inches="tight",
pad_inches=0.05,
)
dpi: 슬라이드 144–300, 인쇄 대비 300+.figsize: 인치+dpi를 브랜드 티어로 문서화.transparent+facecolor="none": 흰 매트 방지. 서브픽셀 텍스트는mplcairo검토.
Plotly — Kaleido write_image(PNG)
Figure에는 write_png가 없고 write_image(..., format="png")를 씁니다.
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=[0, 1], y=[0, 1]))
fig.update_layout(
template="plotly_white",
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
)
fig.write_image(
"out/plotly_chart.png",
format="png",
width=1920,
height=1080,
scale=2,
engine="kaleido",
)
width/height: 슬라이드 마스터 픽셀 고정.scale: 1x는1, 레티나는2.engine="kaleido": lockfile에 plotly·kaleido 핀.
Pillow — 최종 Image.save(..., format="PNG")
합성 후 compress_level=6 등으로 저장하고 RGBA·스트레이트 알파를 검증하세요.
③ sRGB·ICC·납품 검수 정렬
ICC는 파이프라인에서 추가하지 않으면 자동 계약이 아닙니다. 웹·슬라이드는 sRGB를 기준으로 플레이트·정책·매니페스트로 증명하세요. 심화: sRGB·P3 체크리스트, ICC·무손실 재압축.
| 검사 | 조치 | 합격 |
|---|---|---|
| 색 의도 문서화 | README에 “sRGB 납품” vs “P3 내부 전용” 명시 | 티켓 문구가 디자인 도구 PNG 파라미터 가이드와 충돌 없음 |
| 중립 배경 QA | Safari·Chrome에서 #FFFFFF·#0B0B0B 배경에 올려 확인 | 감마 서프라이즈 없음·허용 Δ 내 브랜드 hex |
| 투명 차트 | 범례 모서리 400% 확대 | 회색 프린지 없음·벡터 기준과 어긋남 없음 |
| 선택 ICC 패스 | 마케팅이 임베드를 요구하면 픽셀 QA 이후 조직 규칙대로 exiftool/sips | 태그만 맞고 픽셀은 변하지 않음 |
④ 원격 Mac mini M4: 배치 경로·검수 체크리스트
야간 배치는 전용 Apple Silicon에 두어 절전·VPN·폰트 드리프트를 줄입니다.
~/png_jobs/viz_export/inbox/— 렌더러가 원시 PNG 기록.~/png_jobs/viz_export/work/— 선택 합성·워터마크.~/png_jobs/viz_export/out/YYYY-MM-DD/— 승격 자산 + manifest.~/png_jobs/viz_export/log/export.jsonl— 파일당 tool·버전·dpi 또는 scale·sha256 한 줄.
4K·대형 캔버스: 4K PNG 일괄. 자동 게이트: PNG QA 배치.
| # | 검수 게이트 | 도구 힌트 |
|---|---|---|
| 1 | 너비·높이가 스펙과 일치(±0 px) | sips -g pixelWidth -g pixelHeight 또는 Pillow Image.open(...).size |
| 2 | 파일 크기 최소·최대(빈 렌더 포착) | stat -f%z(BSD)·워처 임계 |
| 3 | 의도치 않은 다운스케일 없음(dpi/scale 드리프트) | manifest의 dpi 또는 scale을 lockfile과 대조 |
| 4 | 텍스트 선명도 스팟 체크 | 미리보기 100% + 대상 슬라이드 마스터 |
| 5 | 결정적 재실행 | 동일 커밋 해시 재수출 시 sha256 동일(폰트 고정 시) |
⑤ 요약
Agg·savefig vs Kaleido·write_image: 백엔드·버전 동결, 크기는 인치×dpi 또는 픽셀×scale로 단일화합니다. sRGB 플레이트·알파 검사·날짜 out/를 원격 M4에 두면 납품 재현성이 올라갑니다.
다음 단계: 차트 PNG 배치용 원격 Mac M4 대여
홈 → 구매·대여·요금(로그인 불필요) → SSH/VNC로 접속해 위 폴더를 복사한 뒤 야간 잡을 돌리세요. 더 읽기: 기술 인사이트.