제안 시스템

디자인킷 · 그래프

캘린더 히트맵(한 달 발행·집행 표시)

D-그래프-캘린더히트맵

캘린더 히트맵(한 달 발행·집행 표시)

언제 쓰는가

한 달 동안 언제 콘텐츠를 발행하고 언제 광고를 집행하는지 달력 모양으로. 월간 운영 계획, 월간 리포트의 실행 내역. 한 달(5주 줄, 6주에 걸치는 달은 칸 높이 축소). 주요 일정 하루만 강조색. 값 바꾸는 법: 칸 x = 요일 순번(월 0 ~ 일 6) × 108, y = 24 + 주 순번 × 50, 크기 104 × 46. 1일의 요일 순번에 맞춰 시작 칸을 밀어 넣음. 발행 0건 class sf, 1건 g1, 2건 이상 g2, 오른쪽 위에 "발행 n". 광고 집행일은 칸 아래에 얇은 띠(rect class g4, 높이 4). 주요 일정 하루만 칸 class a + 글자 class on. 오른쪽 요약의 건수·일수는 달력을 센 값.

참고

GitHub 기여 그래프로 익숙한 캘린더 히트맵(Financial Times Visual Vocabulary(https://github.com/Financial-Times/chart-doctor/tree/main/visual-vocabulary) Change over Time 분류의 calendar heatmap)과 콘텐츠 캘린더 템플릿의 월간 달력 구성, Looker Studio 마케팅 대시보드의 일별 활동 표기(https://supermetrics.com/blog/looker-studio-examples) 참고. 발행 건수는 칸 농도, 광고 집행은 칸 아래 띠로 겹쳐 직접 제작.

조각

<div class="dk dk-cal">
<div class="dk-card">
<p class="ttl"><span>10월 콘텐츠 발행과 광고 집행 일정</span><span class="lg"><span><i class="c-g1"></i>발행 1건</span><span><i class="c-g2"></i>발행 2건 이상</span><span><i class="c-g4"></i>광고 집행일</span><span><i class="c-a"></i>주요 일정</span></span></p>
<svg width="1088" height="274" viewBox="0 0 1088 274" role="img">
<text x="52" y="14" text-anchor="middle">월</text>
<text x="160" y="14" text-anchor="middle">화</text>
<text x="268" y="14" text-anchor="middle">수</text>
<text x="376" y="14" text-anchor="middle">목</text>
<text x="484" y="14" text-anchor="middle">금</text>
<text x="592" y="14" text-anchor="middle">토</text>
<text x="700" y="14" text-anchor="middle">일</text>
<rect x="324" y="24" width="104" height="46" rx="4" class="g1"/>
<text x="334" y="43" class="k">1</text>
<text x="418" y="43" text-anchor="end" class="v">발행 1</text>
<rect x="432" y="24" width="104" height="46" rx="4" class="g1"/>
<text x="442" y="43" class="k">2</text>
<text x="526" y="43" text-anchor="end" class="v">발행 1</text>
<rect x="540" y="24" width="104" height="46" rx="4" class="sf"/>
<text x="550" y="43" class="k">3</text>
<rect x="648" y="24" width="104" height="46" rx="4" class="sf"/>
<text x="658" y="43" class="k">4</text>
<rect x="0" y="74" width="104" height="46" rx="4" class="g1"/>
<text x="10" y="93" class="k">5</text>
<text x="94" y="93" text-anchor="end" class="v">발행 1</text>
<rect x="108" y="74" width="104" height="46" rx="4" class="sf"/>
<text x="118" y="93" class="k">6</text>
<rect x="216" y="74" width="104" height="46" rx="4" class="g2"/>
<text x="226" y="93" class="k">7</text>
<text x="310" y="93" text-anchor="end" class="v">발행 2</text>
<rect x="324" y="74" width="104" height="46" rx="4" class="sf"/>
<text x="334" y="93" class="k">8</text>
<rect x="432" y="74" width="104" height="46" rx="4" class="g1"/>
<text x="442" y="93" class="k">9</text>
<text x="526" y="93" text-anchor="end" class="v">발행 1</text>
<rect x="540" y="74" width="104" height="46" rx="4" class="sf"/>
<text x="550" y="93" class="k">10</text>
<rect x="648" y="74" width="104" height="46" rx="4" class="sf"/>
<text x="658" y="93" class="k">11</text>
<rect x="0" y="124" width="104" height="46" rx="4" class="g2"/>
<text x="10" y="143" class="k">12</text>
<text x="94" y="143" text-anchor="end" class="v">발행 2</text>
<rect x="10" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="108" y="124" width="104" height="46" rx="4" class="sf"/>
<text x="118" y="143" class="k">13</text>
<rect x="118" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="216" y="124" width="104" height="46" rx="4" class="g1"/>
<text x="226" y="143" class="k">14</text>
<text x="310" y="143" text-anchor="end" class="v">발행 1</text>
<rect x="226" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="324" y="124" width="104" height="46" rx="4" class="g1"/>
<text x="334" y="143" class="k">15</text>
<text x="418" y="143" text-anchor="end" class="v">발행 1</text>
<rect x="334" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="432" y="124" width="104" height="46" rx="4" class="g1"/>
<text x="442" y="143" class="k">16</text>
<text x="526" y="143" text-anchor="end" class="v">발행 1</text>
<rect x="442" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="540" y="124" width="104" height="46" rx="4" class="sf"/>
<text x="550" y="143" class="k">17</text>
<rect x="550" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="648" y="124" width="104" height="46" rx="4" class="sf"/>
<text x="658" y="143" class="k">18</text>
<rect x="658" y="158" width="84" height="4" rx="2" class="g4"/>
<rect x="0" y="174" width="104" height="46" rx="4" class="g1"/>
<text x="10" y="193" class="k">19</text>
<text x="94" y="193" text-anchor="end" class="v">발행 1</text>
<rect x="10" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="108" y="174" width="104" height="46" rx="4" class="g2"/>
<text x="118" y="193" class="k">20</text>
<text x="202" y="193" text-anchor="end" class="v">발행 2</text>
<rect x="118" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="216" y="174" width="104" height="46" rx="4" class="g2"/>
<text x="226" y="193" class="k">21</text>
<text x="310" y="193" text-anchor="end" class="v">발행 2</text>
<rect x="226" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="324" y="174" width="104" height="46" rx="4" class="a"/>
<text x="334" y="193" class="on">22</text>
<text x="418" y="211" text-anchor="end" class="on">라이브 방송</text>
<rect x="432" y="174" width="104" height="46" rx="4" class="g1"/>
<text x="442" y="193" class="k">23</text>
<text x="526" y="193" text-anchor="end" class="v">발행 1</text>
<rect x="442" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="540" y="174" width="104" height="46" rx="4" class="sf"/>
<text x="550" y="193" class="k">24</text>
<rect x="550" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="648" y="174" width="104" height="46" rx="4" class="sf"/>
<text x="658" y="193" class="k">25</text>
<rect x="658" y="208" width="84" height="4" rx="2" class="g4"/>
<rect x="0" y="224" width="104" height="46" rx="4" class="g1"/>
<text x="10" y="243" class="k">26</text>
<text x="94" y="243" text-anchor="end" class="v">발행 1</text>
<rect x="10" y="258" width="84" height="4" rx="2" class="g4"/>
<rect x="108" y="224" width="104" height="46" rx="4" class="sf"/>
<text x="118" y="243" class="k">27</text>
<rect x="118" y="258" width="84" height="4" rx="2" class="g4"/>
<rect x="216" y="224" width="104" height="46" rx="4" class="g1"/>
<text x="226" y="243" class="k">28</text>
<text x="310" y="243" text-anchor="end" class="v">발행 1</text>
<rect x="226" y="258" width="84" height="4" rx="2" class="g4"/>
<rect x="324" y="224" width="104" height="46" rx="4" class="g2"/>
<text x="334" y="243" class="k">29</text>
<text x="418" y="243" text-anchor="end" class="v">발행 2</text>
<rect x="334" y="258" width="84" height="4" rx="2" class="g4"/>
<rect x="432" y="224" width="104" height="46" rx="4" class="g1"/>
<text x="442" y="243" class="k">30</text>
<text x="526" y="243" text-anchor="end" class="v">발행 1</text>
<rect x="442" y="258" width="84" height="4" rx="2" class="g4"/>
<rect x="540" y="224" width="104" height="46" rx="4" class="sf"/>
<text x="550" y="243" class="k">31</text>
<rect x="550" y="258" width="84" height="4" rx="2" class="g4"/>
<text x="800" y="40">콘텐츠 발행</text>
<text x="800" y="78" class="v hg">22건</text>
<text x="800" y="118">광고 집행</text>
<text x="800" y="156" class="v hg">20일</text>
<line x1="800" y1="180" x2="1088" y2="180" class="gr"/>
<text x="800" y="204" class="v">10.12</text>
<text x="852" y="204" class="k">광고 집행 시작</text>
<text x="800" y="228" class="va">10.22</text>
<text x="852" y="228" class="va">라이브 방송</text>
<text x="800" y="252" class="v">10.29</text>
<text x="852" y="252" class="k">후기 2차 발행</text>
</svg>
<p class="note">예시 수치는 가상 값 · 실제 집계 값과 출처, 집계 기간으로 교체</p>
</div>
</div>

스타일

.dk-cal .dk-card{padding:22px 32px 20px}
.dk-cal .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-cal .lg{display:flex;gap:var(--s4);font-weight:400}
.dk-cal .lg span{display:flex;align-items:center;gap:6px}
.dk-cal .lg i{display:block;width:12px;height:12px;border-radius:3px}
.dk-cal .lg i.c-a{background:var(--ac)}
.dk-cal .lg i.c-w{background:var(--acw)}
.dk-cal .lg i.c-s{background:var(--soft)}
.dk-cal .lg i.c-g1{background:var(--g1)}
.dk-cal .lg i.c-g2{background:var(--g2)}
.dk-cal .lg i.c-g3{background:var(--g3)}
.dk-cal .lg i.c-g4{background:var(--g4)}
.dk-cal .lg i.c-o{background:none;border:2px solid var(--ac)}
.dk-cal .lg i.c-e{background:var(--soft);border:1px dashed var(--g3)}
.dk-cal .lg i.c-t{width:14px;height:3px;border-radius:0;background:var(--ink)}
.dk-cal .note{font-size:var(--f-cap);color:var(--mu);margin:var(--s3) 0 0}
.dk-cal svg{display:block}
.dk-cal svg text{font-family:inherit;font-size:13px;fill:var(--mu);font-variant-numeric:tabular-nums}
.dk-cal svg .a{fill:var(--ac)}
.dk-cal svg .aw{fill:var(--acw)}
.dk-cal svg .sf{fill:var(--soft)}
.dk-cal svg .g1{fill:var(--g1)}
.dk-cal svg .g2{fill:var(--g2)}
.dk-cal svg .g3{fill:var(--g3)}
.dk-cal svg .g4{fill:var(--g4)}
.dk-cal svg .ax{stroke:var(--line2);stroke-width:1;fill:none}
.dk-cal svg .gr{stroke:var(--line);stroke-width:1;fill:none}
.dk-cal svg .tg{stroke:var(--g3);stroke-width:1;stroke-dasharray:4 4;fill:none}
.dk-cal svg text.k{fill:var(--ink2)}
.dk-cal svg text.v{fill:var(--ink);font-weight:600}
.dk-cal svg text.va{fill:var(--ac);font-weight:700}
.dk-cal svg text.on{fill:var(--card);font-weight:600}
.dk-cal svg text.big{font-size:24px;font-weight:700}
.dk-cal svg text.md{font-size:16px}
.dk-cal svg .ln{fill:none;stroke:var(--g4);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
.dk-cal svg .ln.hot{stroke:var(--ac)}
.dk-cal svg .ln.sub{stroke:var(--g2);stroke-width:2}
.dk-cal svg .dot{fill:var(--ac);stroke:var(--card);stroke-width:2}
.dk-cal svg .dot.m{fill:var(--g4)}
.dk-cal svg .dot.s{fill:var(--g2)}
.dk-cal svg .ol{fill:none;stroke:var(--ac);stroke-width:2.5}
.dk-cal svg .al{stroke:var(--ac);stroke-width:1.5;fill:none}
.dk-cal svg text.hg{font-size:32px;font-weight:700}