논문 그림
그림은 가시화된 주장입니다. 독자가 캡션을 읽기 전에 5초만 보고도 그 그림이 전달하는 주장을 말할 수 있을 때, 그 그림은 자리할 가치가 있습니다. 이 스킬의 모든 것은 이 테스트를 위해 존재합니다.
이 스킬이 구현하는 스타일은 S&P, USENIX Security, CCS, NDSS의 강력한 논문들이 공유하는 스타일입니다: 작은 크기, 벡터, 2단 너비 그림; 적은 표시 항목; 직접 레이블; 인쇄 적합 색상; 축을 설명하는 대신 핵심을 담은 캡션.
핵심 원칙
하나의 그림 = 하나의 주장 = 캡션의 하나의 메시지.
두 개의 주장을 보여줘야 한다면, 두 개의 패널이나 두 개의 그림을 그리세요. 세 가지를 보여주는 그림은 어떤 것도 보여주지 못한 것으로 읽힙니다.
타협할 수 없는 사항
- 그림 당 하나의 메시지. 캡션의 첫 문장이 그것을 밝히고, 그래픽이 그것을 뒷받침합니다.
- 인쇄 크기로 그리세요. 단일 컬럼 그림의 너비는 IEEE 3.5인치, ACM sigconf 3.33인치, USENIX 3.4인치입니다. LaTeX에서 크게 그리고 축소하지 마세요. 그러면 글꼴이 7pt 기준 이하로 줄어듭니다.
- 벡터 출력 (matplotlib의
.pdf). 텍스트나 선이 있는 모든 것에 해당합니다. 300dpi 래스터는 사진과 스크린샷에만 사용하세요. - 인쇄 크기에서 글꼴 ≥ 7pt; 축 레이블 8pt, 눈금 레이블 7pt.
- 인쇄 적합 색상: Okabe-Ito 팔레트, 색상만으로 구별되지 않아야 하며, 그림이 그레이스케일에서도 살아남아야 합니다 (
scripts/check_figure.py --preview). - 오해를 부르는 축 없음: 막대 차트는 0에서 시작; 로그 스케일은 레이블 표시; 차이를 과장하기 위해 y축을 자르지 않음; 명시적이고 명시된 이유 없이 이중 y축 사용 금지.
- 불확실성 표시: 정량적 주장이 있는 경우 CI 밴드, 오차 막대, 또는 캡션의 n. 분모가 없는 점 추정치는 결과가 아닙니다.
- 캡션은 무엇을 주목해야 하는지, 그 다음 단위, 그 다음 n을 말합니다. 색상 목록이 아닙니다.
- 차트정크 없음: 3D, 그림자, 장식용 그라데이션, 무지개 색상표, 배경 채움, 데이터와 싸우는 격자선 금지.
- 재현 가능: 그림을 생성한 스크립트가 데이터 파일이나 시드와 함께 리포지토리 옆에 있어야 합니다. 아무도 재생성할 수 없는 그림은 카메라 레디 시점에서 책임입니다.
0단계 — 먼저 주장을 결정하세요
그림이 자명하게 만들어야 할 문장을 한 문장으로 쓰세요:
"공개 익스플로잇 코드가 이제 권고보다 더 빨리 나타납니다: 30일 아티팩트-대-권고 비율이 4개 시대에 걸쳐 0.63에서 1.83으로 상승했습니다."
"그리고" 없이 그 문장을 쓸 수 없다면, 두 개의 그림이 있는 것입니다.
matplotlib을 만지기 전에 templates/figure-brief.md를 작성하세요. 2분이면 되고 가장 흔한 재작업(잘못된 수량을 보여주는 아름다운 그림)을 방지합니다.
1단계 — 주장에서 인코딩을 선택하세요
references/encoding-guide.md를 읽으세요. 간략 버전:
| 주장 유형 | 인코딩 | 피해야 할 것 |
|---|---|---|
| 분포 / 속도 | CDF(계단형), 바이올린, 상자, 스트립 | 분포 없는 평균 막대 |
| 쌍 비교 | 덤벨, 기울기, 쌍 점 | 두 개의 떠 있는 막대 |
| 시간에 따른 구성 | 누적 영역, 소배열 | 파이, 3D 파이 |
| 순위 | 정렬된 수평 막대, 점 그림 | 정렬되지 않은 막대, 무지개 |
| 두 변수 트레이드오프 | 산점도 + 파레토 경계 | 읽을 수 없는 크기의 버블 |
| 행렬 / 커버리지 | 지각적으로 균일한 맵의 히트맵, 셀 내 값 | 값 없는 무지개 히트맵 |
| 프로세스 / 타임라인 | 스윔레인, 타임라인, 시퀀스 다이어그램 | 산문의 날짜 표 |
| 분류 / 결정 | 레이블된 트리, 채워진 셀의 행렬 | 중첩된 글머리 기호 텍스트 |
2단계 — 공유 스타일로 그리세요
import sys; sys.path.insert(0, "scripts")
from figure_style import apply_style, new_fig, save, SERIES, panel_label
apply_style() # 8pt 기준, Okabe-Ito, 인쇄 적합 rcParams
fig, ax = new_fig(3.5, 2.3) # 단일 컬럼, 올바른 종횡비
ax.plot(x, y, color=SERIES[0], label="Pre-AI")
save(fig, "figs/fig1_cdf") # .pdf (LaTeX용) + .png (미리보기) 작성
스타일은 전역적으로 조정하고, 그림마다 절대 조정하지 마세요. 한 논문의 두 그림이 다른 글꼴이나 선 두께를 가지면 다른 두 논문처럼 읽힙니다.
references/style-spec.md는 모든 설정과 그 이유를 나열합니다.
3단계 — 직접 레이블, 캡션은 마지막에
- 범례 상자 대신 계열 이름을 선 끝이나 플롯 위에 배치하세요. 직접 레이블이 충돌할 경우에만 범례를 사용하세요(
examples/fig01_cdf.png참조). - 패널 레이블 A, B, C는 왼쪽 상단에 굵게, 캡션에서 참조.
- 축 레이블: 수량 + 단위 + 스케일 (
공개 이후 일수 (로그 스케일)). - 그런 다음
references/captions.md로 캡션을 작성하세요: 핵심 → 축이 무엇을 보여주는지 → 단위/n/CI → 독자가 놓쳐서는 안 되는 한 가지 주의사항.
4단계 — 인쇄 적합하게 만들기
- 팔레트:
scripts/figure_style.py의SERIES(Okabe-Ito). 순차 데이터:cividis, 절대jet사용 금지. 발산:RdBu_r, 의미 있는 0 주변에서만. - 모양으로도 인코딩하세요: 마커와 선 스타일이 계열에 따라 달라져서 그림이 그레이스케일 인쇄와 색맹 리뷰어에게도 살아남습니다.
- 검사기 실행:
python scripts/check_figure.py figs/fig1_cdf.png --preview
크기/dpi, 색상 팔레트, 그레이스케일 및 적색맹 분리를 보고하고 fig1_cdf_gray.png / fig1_cdf_cvd.png를 씁니다. 둘 다 보세요.
references/accessibility.md에 세부 사항(대비, CVD, 대체 텍스트)이 있습니다.
5단계 — 내보내기 및 포함
- 임베디드 TrueType 글꼴로 벡터 PDF 내보내기 (
pdf.fonttype = 42, 이미 설정됨). - 인쇄 너비로 포함:
\includegraphics[width=\columnwidth]{figs/fig1_cdf.pdf}. - 컴파일된 PDF를 100%에서 확인: 7pt 미만 텍스트, 잘린 레이블, 논문의 주요 개념 그림이 아닌 한 컬럼 절반보다 긴 그림이 없는지 확인.
references/production.md는 LaTeX 포함, 글꼴 임베딩, 파일 레이아웃을 다룹니다.
6단계 — 리뷰어처럼 검증하기
- 5초 테스트: 누군가에게 그림만 보여주세요; 주장을 말할 수 있나요?
- 캡션 테스트: 첫 문장은 "그림 3은 ...을 보여줍니다"가 아니라 주장이어야 합니다.
- 그레이스케일 테스트: 두 미리보기 모두 올바르게 읽힙니다.
- 확대 테스트: 컴파일된 PDF의 100%에서 모든 레이블을 읽을 수 있습니다.
- 무결성 테스트: 그림의 숫자가 표와 본문과 일치합니다; 축이 잘리지 않았습니다; 오차 막대가 캡션에 정의되어 있습니다.
- 재사용 테스트: PNG를 삭제하세요; 스크립트가 바이트 단위로 동일하게 재생성합니까? 그렇습니다.
표시 항목 예산
| 학회 등급 | 총 표시 항목 | 비고 |
|---|---|---|
| Top-4 학회 | 6–10 | 개념 그림 하나, 타임라인 하나, 결과 표; 모든 항목이 본문에서 참조됨 |
| 매거진 | 4–6 | 항목당 하나의 메시지; 부록 대신 사이드바 |
| 저널 | 8–12 | 더 많은 공간, 동일한 규칙 |
그림이 본문에서 주장과 함께 참조되지 않으면("그림 5는 X를 보여줍니다"), 제거하거나 문장을 다시 작성하세요.
안티 패턴
| 안티 패턴 | 실패 이유 |
|---|---|
| 무지개/jet 색상표 | 지각적으로 정렬되지 않음; 값을 오도함; 그레이스케일에서 읽을 수 없음 |
| 3D 또는 그림자 막대/파이 | 비교를 왜곡하는 장식 |
| 3개 이상의 조각이 있는 파이 | 인간은 각도 비교를 못함; 정렬된 막대 사용 |
| 이중 y축 | 데이터가 뒷받침하지 않는 상관관계 주장을 유도함; 두 개의 패널 사용 |
| 막대의 잘린 y축 | 차이를 과장함; 리뷰어가 알아차릴 것임 |
| 6개 항목이 있는 범례 상자 | 색상 매칭을 강요함; 직접 레이블 또는 소배열 사용 |
| LaTeX에서 축소된 작은 텍스트 | 글꼴이 7pt 아래로 떨어짐; 그림이 회색 노이즈가 됨 |
| 색상을 나열하는 캡션 | "파란 선은 ..."은 독자가 볼 수 없는 것을 알려줌 |
| 표의 스크린샷 | 벡터가 아니고, 편집 가능하지 않으며, 접근성 없음 |
| 표를 다시 말하는 그림 | 표시 항목 낭비; 주장을 지지하는 것을 유지 |
| 레이블 없는 로그 축 | 독자가 수십 년에 걸친 기울기를 비교할 수 없음 |
| 누락된 n / 오차 막대 | 불확실성 없는 점 추정치는 증거가 아님 |
리소스 맵
| 파일 | 용도 |
|---|---|
references/venue-figure-profiles.md | Top-4 학회가 기대하는 것, 컬럼 너비, 캡션/배치 규칙 |
references/encoding-guide.md | 주장 → 차트 매핑, 로그 스케일, 불확실성, 표가 더 나은 경우 |
references/style-spec.md | 이유가 있는 모든 matplotlib 설정; 팔레트 16진수 코드 |
references/captions.md | 캡션 공식 및 전/후 예제 |
references/accessibility.md | 색맹 및 그레이스케일 안전, 대비, 대체 텍스트 |
references/production.md | 내보내기, LaTeX 포함, 글꼴, 파일 레이아웃, 재현성 |
references/anti-patterns.md | 제거할 것과 보여주는 예제 |
scripts/figure_style.py | rcParams, Okabe-Ito 팔레트, new_fig, save, panel_label |
scripts/check_figure.py | 크기/dpi 검사, 그레이스케일 및 적색맹 미리보기, 팔레트 보고서 |
scripts/make_examples.py | 모든 예제 그림 생성 (합성 데이터) |
examples/ | 참조 이미지: 좋은 예와 나쁜 예 vs 좋은 예 쌍 |
templates/figure-brief.md | 그림 그리기 전 한 페이지 분량의 간략 설명 |