디자인킷 · 그래프
요일·시간대 히트맵과 집행 시간대 테두리
D-그래프-히트맵-집행시간테두리
언제 쓰는가
반응이 몰리는 시간과 실제로 광고를 켜 둘 시간(노출 시간 설정)을 겹쳐 보여 주는 장면. 광고 일정 설정 제안. 7행 × 12열(2시간 단위) 고정, 테두리 1~3개. 칸은 무채색 5단, 강조색은 테두리에만. 값 바꾸는 법: 칸 = rect(x = 44 + 열 × 87, y = 24 + 행 × 35, 84 × 32). 값 5구간으로 class sf → g1 → g2 → g3 → g4. 테두리 rect(class ol): x = 44 + 시작 열 × 87 − 3, y = 24 + 시작 행 × 35 − 3, width = 열 수 × 87 + 3, height = 행 수 × 35 + 3. 아래 문구의 두 비율 = 테두리 안 칸 수 ÷ 84, 테두리 안 값 합 ÷ 전체 값 합.
참고
구글 애즈 광고 일정(ad schedule) 화면의 요일 × 시간 격자와 Datawrapper 색 안내(https://www.datawrapper.de/blog/which-color-scale-to-use-in-data-vis)의 순차 값 밝기 단계, Financial Times Visual Vocabulary(https://github.com/Financial-Times/chart-doctor/tree/main/visual-vocabulary) 분류의 heatmap 참고. 집행 구간을 테두리로만 얹는 구성은 직접 제작.
조각
<div class="dk dk-heatb"> <div class="dk-card"> <p class="ttl"><span>요일·시간대별 전환 지수 · 최근 8주</span><span class="lg"><span><i class="c-s"></i>낮음</span><span><i class="c-g1"></i></span><span><i class="c-g2"></i></span><span><i class="c-g3"></i></span><span><i class="c-g4"></i>높음</span><span><i class="c-o"></i>집행 시간대</span></span></p> <svg width="1088" height="296" viewBox="0 0 1088 296" role="img"> <text x="86" y="14" text-anchor="middle">0시</text> <text x="173" y="14" text-anchor="middle">2시</text> <text x="260" y="14" text-anchor="middle">4시</text> <text x="347" y="14" text-anchor="middle">6시</text> <text x="434" y="14" text-anchor="middle">8시</text> <text x="521" y="14" text-anchor="middle">10시</text> <text x="608" y="14" text-anchor="middle">12시</text> <text x="695" y="14" text-anchor="middle">14시</text> <text x="782" y="14" text-anchor="middle">16시</text> <text x="869" y="14" text-anchor="middle">18시</text> <text x="956" y="14" text-anchor="middle">20시</text> <text x="1043" y="14" text-anchor="middle">22시</text> <text x="0" y="45" class="k">월</text> <rect x="44" y="24" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="24" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="24" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="24" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="24" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="24" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="24" width="84" height="32" rx="3" class="g3"/> <rect x="653" y="24" width="84" height="32" rx="3" class="g2"/> <rect x="740" y="24" width="84" height="32" rx="3" class="g2"/> <rect x="827" y="24" width="84" height="32" rx="3" class="g3"/> <rect x="914" y="24" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="24" width="84" height="32" rx="3" class="g3"/> <text x="0" y="80" class="k">화</text> <rect x="44" y="59" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="59" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="59" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="59" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="59" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="59" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="59" width="84" height="32" rx="3" class="g3"/> <rect x="653" y="59" width="84" height="32" rx="3" class="g2"/> <rect x="740" y="59" width="84" height="32" rx="3" class="g2"/> <rect x="827" y="59" width="84" height="32" rx="3" class="g3"/> <rect x="914" y="59" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="59" width="84" height="32" rx="3" class="g3"/> <text x="0" y="115" class="k">수</text> <rect x="44" y="94" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="94" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="94" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="94" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="94" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="94" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="94" width="84" height="32" rx="3" class="g3"/> <rect x="653" y="94" width="84" height="32" rx="3" class="g2"/> <rect x="740" y="94" width="84" height="32" rx="3" class="g2"/> <rect x="827" y="94" width="84" height="32" rx="3" class="g3"/> <rect x="914" y="94" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="94" width="84" height="32" rx="3" class="g3"/> <text x="0" y="150" class="k">목</text> <rect x="44" y="129" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="129" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="129" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="129" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="129" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="129" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="129" width="84" height="32" rx="3" class="g3"/> <rect x="653" y="129" width="84" height="32" rx="3" class="g2"/> <rect x="740" y="129" width="84" height="32" rx="3" class="g2"/> <rect x="827" y="129" width="84" height="32" rx="3" class="g3"/> <rect x="914" y="129" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="129" width="84" height="32" rx="3" class="g4"/> <text x="0" y="185" class="k">금</text> <rect x="44" y="164" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="164" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="164" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="164" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="164" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="164" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="164" width="84" height="32" rx="3" class="g3"/> <rect x="653" y="164" width="84" height="32" rx="3" class="g2"/> <rect x="740" y="164" width="84" height="32" rx="3" class="g2"/> <rect x="827" y="164" width="84" height="32" rx="3" class="g3"/> <rect x="914" y="164" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="164" width="84" height="32" rx="3" class="g4"/> <text x="0" y="220" class="k">토</text> <rect x="44" y="199" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="199" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="199" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="199" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="199" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="199" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="199" width="84" height="32" rx="3" class="g4"/> <rect x="653" y="199" width="84" height="32" rx="3" class="g3"/> <rect x="740" y="199" width="84" height="32" rx="3" class="g3"/> <rect x="827" y="199" width="84" height="32" rx="3" class="g4"/> <rect x="914" y="199" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="199" width="84" height="32" rx="3" class="g3"/> <text x="0" y="255" class="k">일</text> <rect x="44" y="234" width="84" height="32" rx="3" class="sf"/> <rect x="131" y="234" width="84" height="32" rx="3" class="sf"/> <rect x="218" y="234" width="84" height="32" rx="3" class="sf"/> <rect x="305" y="234" width="84" height="32" rx="3" class="sf"/> <rect x="392" y="234" width="84" height="32" rx="3" class="g1"/> <rect x="479" y="234" width="84" height="32" rx="3" class="g2"/> <rect x="566" y="234" width="84" height="32" rx="3" class="g4"/> <rect x="653" y="234" width="84" height="32" rx="3" class="g3"/> <rect x="740" y="234" width="84" height="32" rx="3" class="g3"/> <rect x="827" y="234" width="84" height="32" rx="3" class="g4"/> <rect x="914" y="234" width="84" height="32" rx="3" class="g4"/> <rect x="1001" y="234" width="84" height="32" rx="3" class="g3"/> <rect x="824" y="21" width="264" height="178" rx="5" class="ol"/> <rect x="563" y="199" width="525" height="70" rx="5" class="ol"/> <text x="44" y="290" class="va">집행 시간대: 평일 18~24시, 주말 12~24시 · 전체 시간의 32%로 전체 반응의 60% 확보</text> </svg> <p class="note">예시 수치는 가상 값 · 실제 집계 값과 출처, 집계 기간으로 교체</p> </div> </div>
스타일
.dk-heatb .dk-card{padding:22px 32px 20px}
.dk-heatb .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-heatb .lg{display:flex;gap:var(--s4);font-weight:400}
.dk-heatb .lg span{display:flex;align-items:center;gap:6px}
.dk-heatb .lg i{display:block;width:12px;height:12px;border-radius:3px}
.dk-heatb .lg i.c-a{background:var(--ac)}
.dk-heatb .lg i.c-w{background:var(--acw)}
.dk-heatb .lg i.c-s{background:var(--soft)}
.dk-heatb .lg i.c-g1{background:var(--g1)}
.dk-heatb .lg i.c-g2{background:var(--g2)}
.dk-heatb .lg i.c-g3{background:var(--g3)}
.dk-heatb .lg i.c-g4{background:var(--g4)}
.dk-heatb .lg i.c-o{background:none;border:2px solid var(--ac)}
.dk-heatb .lg i.c-e{background:var(--soft);border:1px dashed var(--g3)}
.dk-heatb .lg i.c-t{width:14px;height:3px;border-radius:0;background:var(--ink)}
.dk-heatb .note{font-size:var(--f-cap);color:var(--mu);margin:var(--s3) 0 0}
.dk-heatb svg{display:block}
.dk-heatb svg text{font-family:inherit;font-size:13px;fill:var(--mu);font-variant-numeric:tabular-nums}
.dk-heatb svg .a{fill:var(--ac)}
.dk-heatb svg .aw{fill:var(--acw)}
.dk-heatb svg .sf{fill:var(--soft)}
.dk-heatb svg .g1{fill:var(--g1)}
.dk-heatb svg .g2{fill:var(--g2)}
.dk-heatb svg .g3{fill:var(--g3)}
.dk-heatb svg .g4{fill:var(--g4)}
.dk-heatb svg .ax{stroke:var(--line2);stroke-width:1;fill:none}
.dk-heatb svg .gr{stroke:var(--line);stroke-width:1;fill:none}
.dk-heatb svg .tg{stroke:var(--g3);stroke-width:1;stroke-dasharray:4 4;fill:none}
.dk-heatb svg text.k{fill:var(--ink2)}
.dk-heatb svg text.v{fill:var(--ink);font-weight:600}
.dk-heatb svg text.va{fill:var(--ac);font-weight:700}
.dk-heatb svg text.on{fill:var(--card);font-weight:600}
.dk-heatb svg text.big{font-size:24px;font-weight:700}
.dk-heatb svg text.md{font-size:16px}
.dk-heatb svg .ln{fill:none;stroke:var(--g4);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
.dk-heatb svg .ln.hot{stroke:var(--ac)}
.dk-heatb svg .ln.sub{stroke:var(--g2);stroke-width:2}
.dk-heatb svg .dot{fill:var(--ac);stroke:var(--card);stroke-width:2}
.dk-heatb svg .dot.m{fill:var(--g4)}
.dk-heatb svg .dot.s{fill:var(--g2)}
.dk-heatb svg .ol{fill:none;stroke:var(--ac);stroke-width:2.5}
.dk-heatb svg .al{stroke:var(--ac);stroke-width:1.5;fill:none}
.dk-heatb .lg{gap:6px}
.dk-heatb .lg span:last-child{margin-left:var(--s3)}