디자인킷 · 그래프
마일스톤 타임라인과 누적 지표 선
D-그래프-마일스톤누적선
언제 쓰는가
일정(무엇을 언제 했는지)과 결과(누적 지표가 어떻게 쌓였는지)를 한 장에. 캠페인 로드맵의 기대 효과, 종료 리포트. 시점 8~12개, 마일스톤 3~5개(서로 2칸 이상 떨어지게). 누적 선만 강조색, 마일스톤은 무채색 마름모. 값 바꾸는 법: 점 x = 64 + 85 × 순번, y = 206 − 누적 값 ÷ 240 × 190(축 최댓값 240, 값에 맞게 교체). 목표 점선 y 도 같은 식. 영역 polygon = 선의 점들 + 양 끝 바닥 점(y 206). 마일스톤: 해당 주 x 에 선 위 점(dot m)과 값, 바닥까지 점선, 아래 줄(y 250)에 마름모 path 와 이름(y 278). 첫 주 마일스톤 이름은 왼쪽 정렬.
참고
간트·로드맵 템플릿의 마일스톤 마름모 표기(SlideModel 타임라인 템플릿 https://slidemodel.com/templates/tag/timeline/)와 Storytelling with Data(https://www.storytellingwithdata.com)의 누적 선 + 목표선 표기, Financial Times Visual Vocabulary(https://github.com/Financial-Times/chart-doctor/tree/main/visual-vocabulary) Change over Time 분류 참고. 타임라인을 x축 아래에 한 줄로 붙여 같은 시간 축을 쓰도록 직접 제작.
조각
<div class="dk dk-mile"> <div class="dk-card"> <p class="ttl"><span>누적 도달 지수와 실행 마일스톤 · 12주</span></p> <svg width="1088" height="286" viewBox="0 0 1088 286" role="img"> <line x1="44" y1="206" x2="1020" y2="206" class="ax"/> <text x="32" y="210" text-anchor="end">0</text> <line x1="44" y1="126.8" x2="1020" y2="126.8" class="gr"/> <text x="32" y="130.8" text-anchor="end">100</text> <line x1="44" y1="47.7" x2="1020" y2="47.7" class="tg"/> <text x="32" y="51.7" text-anchor="end">200</text> <text x="52" y="39.7" class="k">목표 200</text> <polygon points="64,206 64,201.3 149,194.9 234,186.2 319,175.9 404,162.5 489,147.4 574,130 659,110.2 744,88.8 829,69.8 914,53.2 999,36.6 999,206" class="aw"/> <polyline points="64,201.3 149,194.9 234,186.2 319,175.9 404,162.5 489,147.4 574,130 659,110.2 744,88.8 829,69.8 914,53.2 999,36.6" class="ln hot"/> <text x="64" y="226" text-anchor="middle">1주</text> <text x="149" y="226" text-anchor="middle">2주</text> <text x="234" y="226" text-anchor="middle">3주</text> <text x="319" y="226" text-anchor="middle">4주</text> <text x="404" y="226" text-anchor="middle">5주</text> <text x="489" y="226" text-anchor="middle">6주</text> <text x="574" y="226" text-anchor="middle">7주</text> <text x="659" y="226" text-anchor="middle">8주</text> <text x="744" y="226" text-anchor="middle">9주</text> <text x="829" y="226" text-anchor="middle">10주</text> <text x="914" y="226" text-anchor="middle">11주</text> <text x="999" y="226" text-anchor="middle">12주</text> <line x1="44" y1="250" x2="1020" y2="250" class="ax"/> <line x1="64" y1="201.3" x2="64" y2="206" class="tg"/> <circle cx="64" cy="201.3" r="5" class="dot m"/> <text x="74" y="191.3" text-anchor="start" class="v">6</text> <path d="M64,243 l7,7 l-7,7 l-7,-7 Z" class="g4"/> <text x="64" y="278" text-anchor="start" class="k">계정 세팅 완료</text> <line x1="319" y1="175.9" x2="319" y2="206" class="tg"/> <circle cx="319" cy="175.9" r="5" class="dot m"/> <text x="309" y="165.9" text-anchor="end" class="v">38</text> <path d="M319,243 l7,7 l-7,7 l-7,-7 Z" class="g4"/> <text x="319" y="278" text-anchor="middle" class="k">체험단 1차 발행</text> <line x1="574" y1="130" x2="574" y2="206" class="tg"/> <circle cx="574" cy="130" r="5" class="dot m"/> <text x="564" y="120" text-anchor="end" class="v">96</text> <path d="M574,243 l7,7 l-7,7 l-7,-7 Z" class="g4"/> <text x="574" y="278" text-anchor="middle" class="k">영상 광고 시작</text> <line x1="829" y1="69.8" x2="829" y2="206" class="tg"/> <circle cx="829" cy="69.8" r="5" class="dot m"/> <text x="819" y="59.8" text-anchor="end" class="v">172</text> <path d="M829,243 l7,7 l-7,7 l-7,-7 Z" class="g4"/> <text x="829" y="278" text-anchor="middle" class="k">프로모션 시작</text> <circle cx="999" cy="36.6" r="6.5" class="dot"/> <text x="1013" y="44.6" class="va big">214</text> </svg> <p class="note">예시 수치는 가상 값 · 실제 집계 값과 출처, 집계 기간으로 교체</p> </div> </div>
스타일
.dk-mile .dk-card{padding:22px 32px 20px}
.dk-mile .ttl{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--f-cap);font-weight:600;color:var(--mu);margin:0 0 var(--s3)}
.dk-mile .lg{display:flex;gap:var(--s4);font-weight:400}
.dk-mile .lg span{display:flex;align-items:center;gap:6px}
.dk-mile .lg i{display:block;width:12px;height:12px;border-radius:3px}
.dk-mile .lg i.c-a{background:var(--ac)}
.dk-mile .lg i.c-w{background:var(--acw)}
.dk-mile .lg i.c-s{background:var(--soft)}
.dk-mile .lg i.c-g1{background:var(--g1)}
.dk-mile .lg i.c-g2{background:var(--g2)}
.dk-mile .lg i.c-g3{background:var(--g3)}
.dk-mile .lg i.c-g4{background:var(--g4)}
.dk-mile .lg i.c-o{background:none;border:2px solid var(--ac)}
.dk-mile .lg i.c-e{background:var(--soft);border:1px dashed var(--g3)}
.dk-mile .lg i.c-t{width:14px;height:3px;border-radius:0;background:var(--ink)}
.dk-mile .note{font-size:var(--f-cap);color:var(--mu);margin:var(--s3) 0 0}
.dk-mile svg{display:block}
.dk-mile svg text{font-family:inherit;font-size:13px;fill:var(--mu);font-variant-numeric:tabular-nums}
.dk-mile svg .a{fill:var(--ac)}
.dk-mile svg .aw{fill:var(--acw)}
.dk-mile svg .sf{fill:var(--soft)}
.dk-mile svg .g1{fill:var(--g1)}
.dk-mile svg .g2{fill:var(--g2)}
.dk-mile svg .g3{fill:var(--g3)}
.dk-mile svg .g4{fill:var(--g4)}
.dk-mile svg .ax{stroke:var(--line2);stroke-width:1;fill:none}
.dk-mile svg .gr{stroke:var(--line);stroke-width:1;fill:none}
.dk-mile svg .tg{stroke:var(--g3);stroke-width:1;stroke-dasharray:4 4;fill:none}
.dk-mile svg text.k{fill:var(--ink2)}
.dk-mile svg text.v{fill:var(--ink);font-weight:600}
.dk-mile svg text.va{fill:var(--ac);font-weight:700}
.dk-mile svg text.on{fill:var(--card);font-weight:600}
.dk-mile svg text.big{font-size:24px;font-weight:700}
.dk-mile svg text.md{font-size:16px}
.dk-mile svg .ln{fill:none;stroke:var(--g4);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
.dk-mile svg .ln.hot{stroke:var(--ac)}
.dk-mile svg .ln.sub{stroke:var(--g2);stroke-width:2}
.dk-mile svg .dot{fill:var(--ac);stroke:var(--card);stroke-width:2}
.dk-mile svg .dot.m{fill:var(--g4)}
.dk-mile svg .dot.s{fill:var(--g2)}
.dk-mile svg .ol{fill:none;stroke:var(--ac);stroke-width:2.5}
.dk-mile svg .al{stroke:var(--ac);stroke-width:1.5;fill:none}