디자인킷 · 그래프
채널 기여 워터폴(기준선 → 채널별 증분 → 합계)
D-그래프-채널기여워터폴
언제 쓰는가
광고가 없어도 생겼을 전환(기준선) 위에 채널별로 얼마가 더해졌는지 쌓아 보여 주는 장면. 기여 분석, 성과 리포트. 채널 3~5개. 기준선을 반드시 먼저 두고 증분만 광고 성과로 표기. 합계만 강조색. 값 바꾸는 법: 1 지수 = 4px, 막대 x 시작 210. 기준선 막대 width = 기준 값 × 4. 증분 막대 x = 210 + 직전 누계 × 4, width = 증분 × 4. 행 간격 40px, 연결 점선 x = 새 누계 위치. 합계 막대 width = (기준 + 증분 합) × 4. 증분 가운데 비중 = 채널 증분 ÷ 증분 합. 아래 꺾쇠는 기준 값 위치에서 합계 위치까지. 합계가 215를 넘으면 4px 배율 축소.
참고
Cometly의 마케팅 시각화 안내(https://www.cometly.com/post/data-visualization-techniques-marketers-guide)의 채널 기여 워터폴과 증분(incremental) 구분, 컨설팅 장표의 bridge 차트 관행(https://deckary.com/blog/present-data-effectively-powerpoint) 참고. 채널 이름이 길어도 읽히도록 가로형으로 직접 제작.
조각
<div class="dk dk-contrib"> <div class="dk-card"> <p class="ttl"><span>전환 지수의 채널별 증분 · 광고 없이 발생한 전환 100 기준</span><span class="lg"><span><i class="c-g4"></i>기준선</span><span><i class="c-g3"></i>채널 증분</span><span><i class="c-a"></i>합계</span></span></p> <svg width="1088" height="292" viewBox="0 0 1088 292" role="img"> <text x="0" y="14">구분</text> <text x="210" y="14">전환 지수</text> <text x="1088" y="14" text-anchor="end">증분 가운데 비중</text> <text x="0" y="47" class="k md">광고 없이 발생한 전환</text> <rect x="210" y="28" width="400" height="26" rx="3" class="g4"/> <text x="600" y="46" text-anchor="end" class="on">100</text> <line x1="610" y1="54" x2="610" y2="68" class="tg"/> <text x="0" y="87" class="k md">검색 광고</text> <rect x="610" y="68" width="112" height="26" rx="3" class="g3"/> <text x="730" y="86" class="v">+28</text> <text x="1088" y="87" text-anchor="end" class="v md">47%</text> <line x1="722" y1="94" x2="722" y2="108" class="tg"/> <text x="0" y="127" class="k md">SNS 광고</text> <rect x="722" y="108" width="68" height="26" rx="3" class="g3"/> <text x="798" y="126" class="v">+17</text> <text x="1088" y="127" text-anchor="end" class="v md">28%</text> <line x1="790" y1="134" x2="790" y2="148" class="tg"/> <text x="0" y="167" class="k md">영상 광고</text> <rect x="790" y="148" width="36" height="26" rx="3" class="g3"/> <text x="834" y="166" class="v">+9</text> <text x="1088" y="167" text-anchor="end" class="v md">15%</text> <line x1="826" y1="174" x2="826" y2="188" class="tg"/> <text x="0" y="207" class="k md">체험단·후기</text> <rect x="826" y="188" width="24" height="26" rx="3" class="g3"/> <text x="858" y="206" class="v">+6</text> <text x="1088" y="207" text-anchor="end" class="v md">10%</text> <line x1="850" y1="214" x2="850" y2="228" class="tg"/> <text x="0" y="247" class="v md">합계</text> <rect x="210" y="228" width="640" height="26" rx="3" class="a"/> <text x="858" y="247" class="va md">160</text> <path d="M610,260 v6 H850 v-6" class="al"/> <text x="730" y="284" text-anchor="middle" class="va">광고 증분 +60 · 합계의 38%</text> </svg> <p class="note">예시 수치는 가상 값 · 실제 집계 값과 출처, 집계 기간으로 교체</p> </div> </div>
스타일
.dk-contrib .dk-card{padding:22px 32px 20px}
.dk-contrib .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-contrib .lg{display:flex;gap:var(--s4);font-weight:400}
.dk-contrib .lg span{display:flex;align-items:center;gap:6px}
.dk-contrib .lg i{display:block;width:12px;height:12px;border-radius:3px}
.dk-contrib .lg i.c-a{background:var(--ac)}
.dk-contrib .lg i.c-w{background:var(--acw)}
.dk-contrib .lg i.c-s{background:var(--soft)}
.dk-contrib .lg i.c-g1{background:var(--g1)}
.dk-contrib .lg i.c-g2{background:var(--g2)}
.dk-contrib .lg i.c-g3{background:var(--g3)}
.dk-contrib .lg i.c-g4{background:var(--g4)}
.dk-contrib .lg i.c-o{background:none;border:2px solid var(--ac)}
.dk-contrib .lg i.c-e{background:var(--soft);border:1px dashed var(--g3)}
.dk-contrib .lg i.c-t{width:14px;height:3px;border-radius:0;background:var(--ink)}
.dk-contrib .note{font-size:var(--f-cap);color:var(--mu);margin:var(--s3) 0 0}
.dk-contrib svg{display:block}
.dk-contrib svg text{font-family:inherit;font-size:13px;fill:var(--mu);font-variant-numeric:tabular-nums}
.dk-contrib svg .a{fill:var(--ac)}
.dk-contrib svg .aw{fill:var(--acw)}
.dk-contrib svg .sf{fill:var(--soft)}
.dk-contrib svg .g1{fill:var(--g1)}
.dk-contrib svg .g2{fill:var(--g2)}
.dk-contrib svg .g3{fill:var(--g3)}
.dk-contrib svg .g4{fill:var(--g4)}
.dk-contrib svg .ax{stroke:var(--line2);stroke-width:1;fill:none}
.dk-contrib svg .gr{stroke:var(--line);stroke-width:1;fill:none}
.dk-contrib svg .tg{stroke:var(--g3);stroke-width:1;stroke-dasharray:4 4;fill:none}
.dk-contrib svg text.k{fill:var(--ink2)}
.dk-contrib svg text.v{fill:var(--ink);font-weight:600}
.dk-contrib svg text.va{fill:var(--ac);font-weight:700}
.dk-contrib svg text.on{fill:var(--card);font-weight:600}
.dk-contrib svg text.big{font-size:24px;font-weight:700}
.dk-contrib svg text.md{font-size:16px}
.dk-contrib svg .ln{fill:none;stroke:var(--g4);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
.dk-contrib svg .ln.hot{stroke:var(--ac)}
.dk-contrib svg .ln.sub{stroke:var(--g2);stroke-width:2}
.dk-contrib svg .dot{fill:var(--ac);stroke:var(--card);stroke-width:2}
.dk-contrib svg .dot.m{fill:var(--g4)}
.dk-contrib svg .dot.s{fill:var(--g2)}
.dk-contrib svg .ol{fill:none;stroke:var(--ac);stroke-width:2.5}
.dk-contrib svg .al{stroke:var(--ac);stroke-width:1.5;fill:none}