visualization · native chart

TuxChartHeatmap

Matrix heatmap — one cell per row × column pair, intensity on the same 5-stop sequential ramps the choropleth family uses. The workhorse for time-of-day patterns: crash counts by day × hour, corridor demand by month, sensor uptime by station × week. Cells quantize into equal-interval bins and the legend prints the ranges, so color is never the only encoder.

flagship · day × hour

Crashes by day of week and hour

The classic safety-analysis matrix: weekday AM/PM commute peaks in deep maroon, the weekend late-night shelf visible on Saturday and Sunday. Hover a cell — or Tab in and walk the matrix with arrow keys in two dimensions — for the exact count. Column labels auto-thin so the 24-hour axis never shingles.

Mon · 12a: 8Mon · 1a: 9Mon · 2a: 12Mon · 3a: 7Mon · 4a: 8Mon · 5a: 7Mon · 6a: 20Mon · 7a: 31Mon · 8a: 36Mon · 9a: 33Mon · 10a: 19Mon · 11a: 12Mon · 12p: 7Mon · 1p: 8Mon · 2p: 10Mon · 3p: 26Mon · 4p: 39Mon · 5p: 48Mon · 6p: 39Mon · 7p: 23Mon · 8p: 12Mon · 9p: 9Mon · 10p: 3Mon · 11p: 3Tue · 12a: 7Tue · 1a: 10Tue · 2a: 9Tue · 3a: 5Tue · 4a: 8Tue · 5a: 9Tue · 6a: 20Tue · 7a: 32Tue · 8a: 40Tue · 9a: 31Tue · 10a: 20Tue · 11a: 6Tue · 12p: 8Tue · 1p: 6Tue · 2p: 13Tue · 3p: 27Tue · 4p: 39Tue · 5p: 44Tue · 6p: 39Tue · 7p: 27Tue · 8p: 14Tue · 9p: 6Tue · 10p: 3Tue · 11p: 7Wed · 12a: 8Wed · 1a: 10Wed · 2a: 6Wed · 3a: 6Wed · 4a: 6Wed · 5a: 8Wed · 6a: 17Wed · 7a: 30Wed · 8a: 36Wed · 9a: 33Wed · 10a: 20Wed · 11a: 6Wed · 12p: 3Wed · 1p: 4Wed · 2p: 11Wed · 3p: 22Wed · 4p: 40Wed · 5p: 44Wed · 6p: 40Wed · 7p: 25Wed · 8p: 15Wed · 9p: 6Wed · 10p: 7Wed · 11p: 3Thu · 12a: 9Thu · 1a: 9Thu · 2a: 12Thu · 3a: 5Thu · 4a: 6Thu · 5a: 11Thu · 6a: 17Thu · 7a: 29Thu · 8a: 40Thu · 9a: 34Thu · 10a: 18Thu · 11a: 10Thu · 12p: 4Thu · 1p: 9Thu · 2p: 14Thu · 3p: 24Thu · 4p: 38Thu · 5p: 47Thu · 6p: 40Thu · 7p: 27Thu · 8p: 12Thu · 9p: 5Thu · 10p: 3Thu · 11p: 4Fri · 12a: 11Fri · 1a: 11Fri · 2a: 8Fri · 3a: 7Fri · 4a: 7Fri · 5a: 10Fri · 6a: 20Fri · 7a: 29Fri · 8a: 36Fri · 9a: 32Fri · 10a: 19Fri · 11a: 8Fri · 12p: 6Fri · 1p: 7Fri · 2p: 15Fri · 3p: 24Fri · 4p: 37Fri · 5p: 46Fri · 6p: 41Fri · 7p: 24Fri · 8p: 15Fri · 9p: 9Fri · 10p: 3Fri · 11p: 2Sat · 12a: 26Sat · 1a: 28Sat · 2a: 24Sat · 3a: 22Sat · 4a: 15Sat · 5a: 13Sat · 6a: 11Sat · 7a: 12Sat · 8a: 12Sat · 9a: 13Sat · 10a: 12Sat · 11a: 8Sat · 12p: 4Sat · 1p: 5Sat · 2p: 10Sat · 3p: 12Sat · 4p: 14Sat · 5p: 20Sat · 6p: 19Sat · 7p: 12Sat · 8p: 6Sat · 9p: 4Sat · 10p: 4Sat · 11p: 4Sun · 12a: 25Sun · 1a: 25Sun · 2a: 27Sun · 3a: 19Sun · 4a: 14Sun · 5a: 11Sun · 6a: 11Sun · 7a: 11Sun · 8a: 15Sun · 9a: 11Sun · 10a: 12Sun · 11a: 5Sun · 12p: 7Sun · 1p: 6Sun · 2p: 10Sun · 3p: 14Sun · 4p: 16Sun · 5p: 18Sun · 6p: 14Sun · 7p: 13Sun · 8p: 10Sun · 9p: 5Sun · 10p: 8Sun · 11p: 9MonTueWedThuFriSatSun12a2a4a6a8a10a12p2p4p6p8p10p
  • 2–11.2
  • 11.2–20.4
  • 20.4–29.6
  • 29.6–38.8
  • 38.8–48
<tux-chart-heatmap
  :rows="days"
  :cols="hours"
  :values="crashMatrix"
  units="crashes"
/>

slate ramp · value labels · missing data

Travel-time index by corridor and month

Small matrices (≤ ~12 columns) can afford in-cell values — turn on value-labels. The slate ramp is the neutral second voice for a dashboard already anchored by a maroon exhibit. Two sensor outages render as hollow hatched cells and read "No data" — a hole is a hole, never a zero.

I-35 Austin · Jan: 1.471.47I-35 Austin · Feb: 1.501.50I-35 Austin · Mar: 1.521.52I-35 Austin · Apr: 1.541.54I-35 Austin · May: 1.521.52I-35 Austin · Jun: 1.541.54I-35 Austin · Jul: 1.571.57I-35 Austin · Aug: 1.591.59I-35 Austin · Sep: 1.581.58I-35 Austin · Oct: 1.511.51I-35 Austin · Nov: 1.521.52I-35 Austin · Dec: 1.531.53I-45 Houston · Jan: 1.441.44I-45 Houston · Feb: 1.401.40I-45 Houston · Mar: 1.431.43I-45 Houston · Apr: No dataI-45 Houston · May: 1.481.48I-45 Houston · Jun: 1.471.47I-45 Houston · Jul: 1.531.53I-45 Houston · Aug: 1.511.51I-45 Houston · Sep: 1.451.45I-45 Houston · Oct: 1.441.44I-45 Houston · Nov: 1.471.47I-45 Houston · Dec: 1.431.43US-75 Dallas · Jan: 1.371.37US-75 Dallas · Feb: 1.321.32US-75 Dallas · Mar: 1.351.35US-75 Dallas · Apr: 1.331.33US-75 Dallas · May: 1.401.40US-75 Dallas · Jun: 1.381.38US-75 Dallas · Jul: 1.391.39US-75 Dallas · Aug: 1.391.39US-75 Dallas · Sep: 1.431.43US-75 Dallas · Oct: 1.341.34US-75 Dallas · Nov: 1.321.32US-75 Dallas · Dec: 1.341.34I-10 San Antonio · Jan: 1.281.28I-10 San Antonio · Feb: 1.281.28I-10 San Antonio · Mar: 1.301.30I-10 San Antonio · Apr: 1.271.27I-10 San Antonio · May: 1.301.30I-10 San Antonio · Jun: 1.371.37I-10 San Antonio · Jul: 1.331.33I-10 San Antonio · Aug: 1.361.36I-10 San Antonio · Sep: 1.311.31I-10 San Antonio · Oct: 1.311.31I-10 San Antonio · Nov: 1.301.30I-10 San Antonio · Dec: 1.261.26I-27 Lubbock · Jan: 1.161.16I-27 Lubbock · Feb: 1.101.10I-27 Lubbock · Mar: 1.111.11I-27 Lubbock · Apr: 1.171.17I-27 Lubbock · May: 1.141.14I-27 Lubbock · Jun: 1.161.16I-27 Lubbock · Jul: 1.191.19I-27 Lubbock · Aug: 1.211.21I-27 Lubbock · Sep: 1.201.20I-27 Lubbock · Oct: No dataI-27 Lubbock · Nov: 1.121.12I-27 Lubbock · Dec: 1.101.10I-35 AustinI-45 HoustonUS-75 DallasI-10 San AntonioI-27 LubbockJanFebMarAprMayJunJulAugSepOctNovDec
  • 1.10–1.22
  • 1.22–1.35
  • 1.35–1.47
  • 1.47–1.59
  • No data
<tux-chart-heatmap
  :rows="corridors"
  :cols="months"
  :values="ttiMatrix"
  ramp="slate"
  :bins="4"
  value-labels
  :height="220"
  :format="(n) => n.toFixed(2)"
  :decimals="2"
  units="TTI"
/>

print posture

Static, for reports

:tooltip="false" drops the hover layer for PDF / print contexts (the family contract), and the legend can go when a TuxChartFrame caption or a TuxMapLegend nearby already carries the ramp. The SVG <title> per cell and the derived screen-reader summary stay.

Mon · 12a: 8Mon · 1a: 9Mon · 2a: 12Mon · 3a: 7Mon · 4a: 8Mon · 5a: 7Mon · 6a: 20Mon · 7a: 31Mon · 8a: 36Mon · 9a: 33Mon · 10a: 19Mon · 11a: 12Mon · 12p: 7Mon · 1p: 8Mon · 2p: 10Mon · 3p: 26Mon · 4p: 39Mon · 5p: 48Mon · 6p: 39Mon · 7p: 23Mon · 8p: 12Mon · 9p: 9Mon · 10p: 3Mon · 11p: 3Tue · 12a: 7Tue · 1a: 10Tue · 2a: 9Tue · 3a: 5Tue · 4a: 8Tue · 5a: 9Tue · 6a: 20Tue · 7a: 32Tue · 8a: 40Tue · 9a: 31Tue · 10a: 20Tue · 11a: 6Tue · 12p: 8Tue · 1p: 6Tue · 2p: 13Tue · 3p: 27Tue · 4p: 39Tue · 5p: 44Tue · 6p: 39Tue · 7p: 27Tue · 8p: 14Tue · 9p: 6Tue · 10p: 3Tue · 11p: 7Wed · 12a: 8Wed · 1a: 10Wed · 2a: 6Wed · 3a: 6Wed · 4a: 6Wed · 5a: 8Wed · 6a: 17Wed · 7a: 30Wed · 8a: 36Wed · 9a: 33Wed · 10a: 20Wed · 11a: 6Wed · 12p: 3Wed · 1p: 4Wed · 2p: 11Wed · 3p: 22Wed · 4p: 40Wed · 5p: 44Wed · 6p: 40Wed · 7p: 25Wed · 8p: 15Wed · 9p: 6Wed · 10p: 7Wed · 11p: 3Thu · 12a: 9Thu · 1a: 9Thu · 2a: 12Thu · 3a: 5Thu · 4a: 6Thu · 5a: 11Thu · 6a: 17Thu · 7a: 29Thu · 8a: 40Thu · 9a: 34Thu · 10a: 18Thu · 11a: 10Thu · 12p: 4Thu · 1p: 9Thu · 2p: 14Thu · 3p: 24Thu · 4p: 38Thu · 5p: 47Thu · 6p: 40Thu · 7p: 27Thu · 8p: 12Thu · 9p: 5Thu · 10p: 3Thu · 11p: 4Fri · 12a: 11Fri · 1a: 11Fri · 2a: 8Fri · 3a: 7Fri · 4a: 7Fri · 5a: 10Fri · 6a: 20Fri · 7a: 29Fri · 8a: 36Fri · 9a: 32Fri · 10a: 19Fri · 11a: 8Fri · 12p: 6Fri · 1p: 7Fri · 2p: 15Fri · 3p: 24Fri · 4p: 37Fri · 5p: 46Fri · 6p: 41Fri · 7p: 24Fri · 8p: 15Fri · 9p: 9Fri · 10p: 3Fri · 11p: 2Sat · 12a: 26Sat · 1a: 28Sat · 2a: 24Sat · 3a: 22Sat · 4a: 15Sat · 5a: 13Sat · 6a: 11Sat · 7a: 12Sat · 8a: 12Sat · 9a: 13Sat · 10a: 12Sat · 11a: 8Sat · 12p: 4Sat · 1p: 5Sat · 2p: 10Sat · 3p: 12Sat · 4p: 14Sat · 5p: 20Sat · 6p: 19Sat · 7p: 12Sat · 8p: 6Sat · 9p: 4Sat · 10p: 4Sat · 11p: 4Sun · 12a: 25Sun · 1a: 25Sun · 2a: 27Sun · 3a: 19Sun · 4a: 14Sun · 5a: 11Sun · 6a: 11Sun · 7a: 11Sun · 8a: 15Sun · 9a: 11Sun · 10a: 12Sun · 11a: 5Sun · 12p: 7Sun · 1p: 6Sun · 2p: 10Sun · 3p: 14Sun · 4p: 16Sun · 5p: 18Sun · 6p: 14Sun · 7p: 13Sun · 8p: 10Sun · 9p: 5Sun · 10p: 8Sun · 11p: 9MonTueWedThuFriSatSun12a2a4a6a8a10a12p2p4p6p8p10p
<tux-chart-heatmap
  :rows="days"
  :cols="hours"
  :values="crashMatrix"
  :tooltip="false"
  :legend="false"
/>