2026-07-11 00:29:47 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1" / >
< title > Thermograph — reading the grades< / title >
2026-07-11 15:59:14 +00:00
< meta name = "description" content = "Pick any point on Earth and see how its recent weather stacks up against ~45 years of local climate history — graded days, calendars, forecasts, and side-by-side comparisons." / >
< meta name = "theme-color" content = "#f0803c" / >
<!-- Link previews (Discord, Slack, iMessage…). The server fills the og:url /
og:image origins in from this request's scheme://host + base path —
crawlers need absolute URLs and don't run JS. -->
< meta property = "og:type" content = "website" / >
< meta property = "og:site_name" content = "Thermograph" / >
< meta property = "og:title" content = "Thermograph — reading the grades" / >
< meta property = "og:description" content = "Pick any point on Earth and see how its recent weather stacks up against ~45 years of local climate history — graded days, calendars, forecasts, and side-by-side comparisons." / >
< meta property = "og:url" content = "__ORIGIN__/legend" / >
< meta property = "og:image" content = "__ORIGIN__/logo.png" / >
< meta property = "og:image:width" content = "512" / >
< meta property = "og:image:height" content = "512" / >
< meta property = "og:image:alt" content = "Thermograph logo" / >
< meta name = "twitter:card" content = "summary" / >
< link rel = "icon" href = "logo.svg" type = "image/svg+xml" / >
< link rel = "apple-touch-icon" href = "logo.png" / >
2026-07-11 00:29:47 +00:00
< link rel = "stylesheet" href = "style.css" / >
< / head >
< body >
< header >
< div class = "brand" >
< span class = "logo" > ▚< / span >
< div >
< h1 > Thermograph · Guide< / h1 >
< p class = "tag" > What the metrics and percentile grades mean< / p >
< / div >
< nav class = "view-nav" aria-label = "Views" >
< a href = "./" data-view = "map" > Weekly< / a >
< a href = "calendar" data-view = "calendar" > Calendar< / a >
< a href = "day" data-view = "day" > Day< / a >
2026-07-11 02:58:56 +00:00
< a href = "compare" data-view = "compare" > Compare< / a >
2026-07-11 00:29:47 +00:00
< / nav >
< / div >
< / header >
< main class = "guide" >
< section class = "guide-block" >
< h2 > How the grades work< / h2 >
< p > Every grade is < b > relative to this place's own climate history< / b > , not an absolute
temperature. For each day Thermograph builds a ± 7-day seasonal distribution from
decades of local records, then reports the < b > percentile< / b > where the day falls in it.< / p >
< p > So a 60° day can be “ Above Normal” in one place or season and
“ Below Normal” in another. That's why the categories read
“ Above/Below Normal” , “ High/Low” , and “ Near Record” —
never “ hot” or “ cold” .< / p >
< / section >
< section class = "guide-block" >
< h2 > Grade scale — percentile of the local ± 7-day history< / h2 >
< div class = "guide-scale" id = "temp-scale" > < / div >
< / section >
< section class = "guide-block" >
< h2 > Rain intensity — percentile among rain days< / h2 >
< p class = "muted" > Precipitation is graded only across days that actually saw rain, so
“ Heavy” means heavy < i > for a rainy day here< / i > . Dry days are colored by
their dry streak instead (below).< / p >
< div class = "guide-scale" id = "rain-scale" > < / div >
< / section >
< section class = "guide-block" >
< h2 > The metrics< / h2 >
< dl class = "guide-metrics" >
< dt > High / Low< / dt > < dd > The day's highest and lowest air temperature (° F).< / dd >
< dt > Feels< / dt > < dd > Apparent temperature — what the air actually felt like once humidity
2026-07-11 02:58:56 +00:00
and wind are factored in, taking whichever apparent extreme (heat-index high or
wind-chill low) sits further from a temperate baseline, graded against its own history.< / dd >
2026-07-11 00:29:47 +00:00
< dt > Humid< / dt > < dd > Absolute humidity: grams of water vapor per cubic meter of air (g/m³ ).< / dd >
< dt > Wind< / dt > < dd > Average sustained wind speed (mph).< / dd >
< dt > Gust< / dt > < dd > Peak wind gust for the day (mph).< / dd >
< dt > Precip< / dt > < dd > Total precipitation (inches), graded by intensity among rain days.< / dd >
< dt > Dry streak< / dt > < dd > Consecutive days since the last measurable rain — the color deepens
the longer it's been dry, and resets to blue on a rain day.< / dd >
< / dl >
< / section >
< p class = "guide-back" > < a href = "./" > ← Back to Thermograph< / a > < / p >
< / main >
< script src = "nav.js" > < / script >
< script >
// The scale rows mirror the tiers used across the app (see calendar.js / app.js).
const TEMP = [
["rec-cold", "Near Record", "< 1 " ] , [ " very-cold " , " Very Low " , " 1 – 10 " ] ,
["cold", "Low", "10– 25"], ["cool", "Below Normal", "25– 40"],
["normal", "Normal", "40– 60"], ["warm", "Above Normal", "60– 75"],
["hot", "High", "75– 90"], ["very-hot", "Very High", "90– 99"],
["rec-hot", "Near Record", ">99"],
];
const RAIN = [
["wet-1", "Trace", "< 1 " ] , [ " wet-2 " , " Very Light " , " 1 – 10 " ] , [ " wet-3 " , " Light " , " 10 – 25 " ] ,
["wet-4", "Light– Mod", "25– 40"], ["wet-5", "Moderate", "40– 60"], ["wet-6", "Mod– Heavy", "60– 75"],
["wet-7", "Heavy", "75– 90"], ["wet-8", "Very Heavy", "90– 99"], ["wet-9", "Extreme", ">99"],
];
const row = ([cls, label, range]) =>
`< div class = "guide-seg" > < span class = "guide-sw" style = "background:var(--${cls})" > < / span > ` +
`< span class = "guide-lbl" > ${label}< / span > < span class = "guide-rng" > ${range}< / span > < / div > `;
document.getElementById("temp-scale").innerHTML = TEMP.map(row).join("");
document.getElementById("rain-scale").innerHTML = RAIN.map(row).join("");
< / script >
< / body >
< / html >