Solar during an eclipse
The other half of the eclipse-demand story. A solar
curve near sunset is already falling, so eclipse day alone just looks like a
steep evening — the chart only works against the days that didn't have an
eclipse in them. Here the three previous days are the control, and one
collapse turns them into a baseline the interesting day can be judged
against.
The chart
Two views, one toggle. Four days is the raw material: three grey evenings — 9, 10 and 11 August, each plotted forward to eclipse day's clock — and the solid one the Moon interrupted. Anomaly vs baseline collapses the grey days into their per-quarter-hour mean and redraws every curve as a distance from it: eclipse day dives to −4.34 GW at 20:15 CEST, while the grey residuals hug zero through the whole evening ramp. The empty vertical space between them is the point: sunset is the most repeatable thing a solar fleet does, and this one broke the pattern by gigawatts.
The data
Real measured data — Spain's grid-scale solar at 15-minute cadence from energy-charts.info (Fraunhofer ISE), CC BY 4.0, upstream ENTSO-E — the same source family as the German Easter-weekend fixture behind the track's first three cards. Retrieved the morning after the eclipse. Four civil days on one shared index:
| Column | Meaning |
|---|---|
eclipseDay | Solar generation on 12 August, GW — 29.67 peak |
aug09–aug11 | The three days before, shifted to the same clock time |
The shift is the device, so here it is in plain words: the grey curves did not happen when the axis says — each happened one, two or three days earlier. Plotting reference series at a false time is only honest when the page says so, every time. (The Niño 3.4 card does the same thing with 45 years; this is the long-weekend version.)
The baseline is not in the fixture — it's computed in the example, and
that's deliberate: it is one collapse (below), and teaching it is this
card's job. Judged against it, the days have two personalities. The
afternoon is weather: cloud swings individual days up to 3.57 GW from
the pack's mean (at 17:00), and eclipse day itself rides above baseline
from late morning until 18:30, peaking at +3.53 GW at 17:00 — it was the
sunniest of the four (29.67 GW peak against the baseline's 27.22).
The evening ramp is physics: from 19:45 onward the three ordinary days
sit within ±0.53 GW of their mean, tightening to ±0.21 by 20:30. Into
that repeatability the eclipse cuts a −4.34 GW anomaly at 20:15 — at
20:00 the gap is twelve times the ordinary envelope (−3.86 GW against
±0.31) — then fades with the daylight: −0.45 GW by 21:00, gone by 21:30.
Red Eléctrica had pre-announced a loss of up to 5 GW.
One more quirk worth reading off the chart: none of the four days ever touches zero. Each enters the night around 0.5–0.65 GW and drains to 0.12–0.22 GW before dawn — ENTSO-E reports concentrated solar plants discharging stored heat after dark inside the same category as PV.
The eclipse marks are the same ECLIPSE_MARKS constants the demand card
draws (IGN's Madrid circumstances) — one fixture module, two cards, one set
of facts. The time axis renders in your browser's timezone; clock times
here are CEST.
Build it
1. Put all four days in one series. The overlay happens in the
fixture: sample i of every column is the same clock time on a different
day, so one TimeSeries keyed by eclipse-day timestamps carries the whole
comparison. Drawing the raw spaghetti is four <LineChart>s — the reference
pack muted, the subject on top:
const days = eclipseSolar(); // eclipseDay, aug09, aug10, aug11
<Layers>
<LineChart series={days} column="aug09" axis="gw" as="muted" />
<LineChart series={days} column="aug10" axis="gw" as="muted" />
<LineChart series={days} column="aug11" axis="gw" as="muted" />
<LineChart series={days} column="eclipseDay" axis="gw" />
</Layers>;
2. Collapse the pack into a baseline. collapse runs one reducer across
named columns, row by row; { append: true } keeps the inputs alongside the
result. The baseline is the three ordinary days' mean, and every curve's
anomaly is just another collapse against it:
const series = days
.collapse(
['aug09', 'aug10', 'aug11'],
'baseline',
(v) => (v.aug09 + v.aug10 + v.aug11) / 3,
{ append: true },
)
.collapse(
['eclipseDay', 'baseline'],
'delta',
(v) => v.eclipseDay - v.baseline,
{ append: true },
);
The example repeats the delta step for each grey day (aug09Delta, …), so
the ordinary days can be drawn as residuals too — they're the envelope that
tells you whether the anomaly is signal. (In the real source the mean's
inputs come from the exported ECLIPSE_BASELINE_DAYS list rather than being
spelled twice, so the column set has one home.)
3. Re-centre the view. The anomaly mode is the same four layers reading
the delta columns, with the axis relabelled as a distance and a <Baseline>
naming the new zero:
<YAxis id="gw" label="GW vs baseline" format="+.1f" width={56} />
<Layers>
<LineChart series={series} column="aug09Delta" axis="gw" as="muted" />
{/* …aug10Delta, aug11Delta… */}
<LineChart series={series} column="delta" axis="gw" />
<Baseline value={0} axis="gw" label="3-day baseline" />
</Layers>
The toggle between the two is ordinary React state — swap the column props
and the axis; the pond pipeline above already carries both readings of the
same data.
Options to try
| Option | What it does | Reach for it when |
|---|---|---|
| More baseline days | A deeper pack behind the subject | Three days is a long weekend; thirty is a climatology — see Niño 3.4 |
| Median, not mean | collapse with a different reducer | A baseline that shouldn't move when one control day was cloudy |
as="muted" | The reference pack in the theme's neutral | Any shifted or historical comparison curves |
format="+.1f" | Signed tick labels on the anomaly axis | Any re-centred view — the sign is the reading |
min={0} on YAxis | Pins the raw view's floor at zero | Quantities-from-zero (generation, traffic); meaningless once re-centred |
curve="monotone" | Smooths all the bells | 15-minute and coarser cadences, where the ramp shouldn't look like line segments |
See also
- Demand during an eclipse — the same ninety minutes on the demand side, against a forecast instead of a baseline
collapse— the column-math operator both steps lean on<LineChart>— every prop- Niño 3.4 — the same-clock overlay device at full scale
- Grid mix — the source family's licence notes
- Storybook — the systematic knob walk