Skip to content

Figures for the DuPont, SBR and FMC batch case-study pages - #84

Merged
kgdunn merged 38 commits into
mainfrom
claude/issues-154-156-process-3cu4iq
Sep 6, 2026
Merged

kgdunn merged 38 commits into
mainfrom
claude/issues-154-156-process-3cu4iq

Conversation

@kgdunn

@kgdunn kgdunn commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds the figures for three new batch case-study pages in the book's Applications chapter (Three batch case studies for the Applications chapter (DuPont batch PCA, SBR batch PLS, FMC multiblock batch PLS) pid-book#273): the DuPont batch PCA outlier hunt, the SBR batch PLS fault diagnosis, and the FMC multiblock batch PLS ladder.
  • Three matplotlib scripts in batch/ (batch-case-dupont-figures.py, batch-case-sbr-figures.py, batch-case-fmc-figures.py) with a shared style module batch/batch_case_common.py, and the 34 PNGs they write (batch/batch-case-*.png). The scripts run the same analysis as the pages' Plotly code on process-improve 1.81 (Batch case studies: DuPont batch PCA, SBR batch PLS, FMC multiblock batch PLS (#154, #155, #156) process-improve#537: BatchPCA, BatchPLS, BatchMonitor, load_dupont, load_fmc, load_sbr, unfolded_contribution_plot, contributions for rows with missing cells, the r2_per_variable_ fix and the SCP score-estimator fix).
  • Every score plot carries the percent of variance each component explains on its axes (explained_per_component in the shared module: R2 of X per component, from r2_per_variable_ for PLS-type models; R2Y on the multiblock super-score panels). The axes of every PLS-type score plot, block-score panels included, are labelled R2X, so that they are not read as the R2Y of the super scores.
  • The DuPont model B score plot draws a thick arrow, labelled "contribution direction", from a square at the second group's average point to the model centre: the displacement the group contribution figure decomposes. That figure shows the per-tag bars with the eight members as white dots with a dark edge on the left, on alternately shaded positions, and on the right a 2x2 block of raw trajectories over the first 30 samples for the three tags with the largest contributions and for Flow-2. The model C figure projects the 15 batches left out of that model onto it and draws them on the T2-against-SPE panel, on logarithmic axes, beside the 40 training batches.
  • The SBR score plot marks batch 4, the batch nearest the average quality, in purple, because the page's mid-batch prediction figure is drawn for it. The SBR script also writes the four figures of the page's two on-line sections: the leave-one-batch-out prediction error (RMSEP) per attribute against samples observed, batch 4's evolving prediction of particle size and composition with a band of one RMSEP at each sample against its final prediction and measured value (integer ticks on the particle-size axis), the on-line monitoring of batch 37 (Hotelling's T2) and batch 34 (SPE of the newest sample) with the residual shares at the alarm sample, and the trajectory forecast of the remainder of both faulty batches. The leave-one-out sweep (53 refits, traced at every sample) adds about a minute to the script.
  • The SBR departure figure draws two signed distances of each faulty batch from the other batches per tag: a robust one (median and 1.4826 MAD of the others, EWMA-smoothed with lambda 0.3) as a solid line and the mean-and-standard-deviation one dashed.
  • The FMC script carries ClockTime as the eleventh tag of the unfolded trajectory block, as the original study did, and the batch-13 overlay shows the clock time in place of the agitator power. Every FMC score plot is coded by the plant's disposition, a colour and a marker shape per class (blue circles good, purple triangles abnormal, gold squares high solvent, the squares drawn a little smaller so that the three markers read as the same size), at twice the side of a plain dot so that a triangle and a square can be told apart, with the highlighted batches larger still in their class's marker; legends with four entries sit in a 2 x 2 grid, and the block-scores figure has one legend row under its three panels. The bar panels shade alternate positions, and grids are drawn behind the bars and markers (axes.axisbelow). The multiblock PLS on the two initial-condition blocks is a 2 x 3 figure: the super scores in the first column, and for each block its scores above its weights (a weight_plot helper in the script), so that batch 20, inside the cloud in the chemistry block and far outside it in the operating-condition block, can be read against the weights that place it there. The loading panels of the batch PCA carry the cumulative R2 of every cell after two components on a second axis in faint orange. The two phase ends (samples 175 and 249) are marked as vertical lines on the raw overlays, the loading panels, the per-sample panel of batch 20's contribution figure and the raw panels of the four-batch figure. The SPE contribution figure is drawn for batch 20, the batch above both limits, now that process-improve computes contributions for a batch with missing cells: its missing samples 34 to 109 are blank positions and the dryer pressure carries half of the residual (it replaces the batch-41 figure). Two figures are new: the block scores of the batch multiblock PLS, one panel per block, with batches 2, 3, 6 and 7 labelled (classed good, placed with the abnormal batches by the trajectory block and with the good ones by both initial-condition blocks); and the operating-condition contribution from those batches' nearest abnormal neighbours to them, beside the raw collector level, clock time, dryer temperature and its set point for both groups.
  • batch_case_common.py gains online_chart (one batch's per-sample statistic against the reference-batch mean and the dashed per-sample limit), group_scatter (per-class colour and marker, used by score_plot and influence_plot through their groups and group_styles options, with the marker areas MARKER, MARKER_CODED, HIGHLIGHT, HIGHLIGHT_CODED and a per-marker area scale), compact_legend (two columns from four entries), label_bars, shade_alternate_tags, secondary and vlines options on tag_panels, overlay_panels and contribution_triptych (a second right-hand axis and vertical lines at the phase ends), a label_left option on score_plot and parity_plot and a legend_loc option on score_plot and influence_plot (for the labels and legends that would otherwise sit on a neighbour), and three more categorical colours (purple, gold for the FMC high-solvent class, magenta for the SBR page).
  • All three data sets are live on openmv.net when the scripts run (polymerization.csv, batch-dryer.xlsx, sbr-batch-reactor.xlsx); the SBR script keeps a --data-url option for a local copy when working offline.

Colours are the book's house colours (dark blue, orange, with aqua as the second highlight), checked as a categorical set with a colour-vision-deficiency validator; raw overlays and per-tag panels use small multiples rather than many-hued lines.

Library dependency of the FMC loading panels. The orange R2 curves read PCA.r2_per_variable_, which on the library's NIPALS path (taken because the trajectories have missing cells) used to hold the share of the remaining residual that each component explained rather than the cumulative R2; the committed PNG was regenerated against the fix in kgdunn/process-improve#537 (the collector-tank cells read 0.07 before and 0.78 after). Regenerating it against an older library reproduces the wrong curve.

Script checks. The "Against process-improve main" and "Against the PyPI release" jobs fail on the three batch scripts because they import load_dupont, load_fmc, load_sbr and BatchMonitor, which exist only on the kgdunn/process-improve#537 branch (the PyPI release does not even carry BatchPCA). They pass once #537 merges (main job) and a release carries it (PyPI job); nothing in this repository fixes them.

Merge order: this PR first, then the book PR kgdunn/pid-book#273, so the book's PDF build finds the images.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE


Generated by Claude Code

Matplotlib scripts and their PNGs for the DuPont batch PCA, SBR batch PLS
and FMC multiblock batch PLS case studies of the Applications chapter, with
a shared style module. The scripts run the same analysis as the chapter's
Plotly code, using process-improve 1.79 (BatchPCA, BatchPLS, the remote
loaders and unfolded contribution plots).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The SPE plots put the batch number on the horizontal axis, which is the
order the batches happen to appear in the file rather than a property of the
batch, and drew a stem down to zero from every dot, which encodes nothing
beyond the dot's own position.

Both statistics now share one figure: Hotelling's T2, how far a batch sits
along the model's components, against the SPE, how far it sits away from
them, with each 95% limit as a reference line. The quadrants separate the two
kinds of unusual batch, and on this data they do so cleanly. In the DuPont
model A, batch 49 has the largest SPE of all 55 batches with a T2 of 0.4,
while batches 50 and 52 to 55 are beyond the T2 limit with residuals below
the SPE limit. In the FMC batch PCA, batch 20 is the only batch above both
limits.

Colour in the DuPont figures now marks which of the two limits a batch
exceeds, which also corrects the score plot: batch 51 is inside the 95%
confidence ellipse, not outside it as the six-batch grouping implied. The
SBR figure labels all three batches above its SPE limit, 8, 15 and 16.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
Dark blue is the colour of every unremarkable batch in the score and
influence plots, so using it for batch 54 in the raw trajectory overlay gave
the same colour two meanings. Batch 54 is aqua there now, matching the colour
it carries in the two scatter plots as a batch beyond the T2 limit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The second cluster was illustrated by batch 39 alone, which carries its own
quirks: on t2 its TempH-1 and Press-2 contributions have the opposite sign to
the rest of the group, and TempH-1 swings from -3.8 to +2.4 across the eight
members, averaging to nearly nothing. Reading one member as representative
therefore points at tags the group does not share.

The columns are centred, so the model centre is the origin and contributions
are linear in the row: the mean of the members' contribution vectors is the
contribution of the group mean, and it sums to the group's mean score, 15.0 on
t2 and 14.8 on t3 against -3.0 for the other 40 batches. The new figure plots
that for both components with every member as a dot, so a reader can see which
tags the cluster shares (TempC-1 and Press-3) and which it does not.

A second figure confirms it in the raw data. Over the whole batch the gap
between the cluster and the rest is under 2% of the panel height for two of
the three tags, so the panels show samples 0 to 30, the window carrying 65% of
the t2 and 89% of the t3 contribution, where the eight batches separate
cleanly from the other forty.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The window is samples 0 to 25 inclusive, which carries 66% of the cluster's t2
contribution and 90% of its t3 contribution, not 65% and 89%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
Reading a tag's share off the axis is a two-step; the number belongs on the
bar. One change in contribution_triptych covers all five three-panel figures
across the three case studies.

label_bars places the value at the outer end of the bar, above a positive one
and below a negative one, and widens the axis on whichever side carries bars so
a label never lands on the frame. A value below the floor is written as a bound
rather than as the rounded 0.0: CTankLvl carries 0.046% of batch 51's SPE, and
"0.0" beside a bar of no visible height would read as an exact zero.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The unfolded panel at the top shades alternate tag blocks so the eye can find
where one tag ends and the next begins. The summed-per-tag panel below it had
no such striping, so tracking a tag from the block above to its bar below meant
matching the labels. The same alternation now runs behind the bars, one band per
tag position, and the same tags are shaded in both panels.

The x grid goes off in that panel with it, as it already is in the panel above:
its lines fall on the bar centres, straight down the middle of each new band.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The sign is the useful part: it says whether a tag ran above or below the other
batches, which the absolute value threw away. Batch 34's cooling-water and
jacket temperatures now visibly rise above the band while its energy released,
conversion and latex density fall below it, and batch 37 falls below in the
latex density and the conversion. That is the direction the surrounding text
argues from, and until now the figure could not show it.

The band between plus and minus two standard deviations is shaded, with a
dashed line and a label on each edge and a zero line through the middle. The
onset rule is unchanged: it still tests the magnitude, so the reported samples
are the same.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
online_chart draws one batch's per-sample Hotelling's T2 or SPE against
the reference-batch mean and the dashed per-sample limit, marks the
samples above the limit and writes a fault label along an optional
vertical line. PURPLE and MAGENTA extend the house set to five
categorical colours for the five SBR quality attributes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The mid-batch prediction error (RMSEE and leave-one-batch-out RMSEP per
attribute against samples observed), batch 4's evolving prediction of
particle size and composition against its final prediction and measured
value, the on-line monitoring of batch 37 (T2) and batch 34 (SPE of the
newest sample) with the residual shares at the alarm sample, and the
trajectory forecast of the remainder for both faulty batches. The script
needs process-improve 1.80 for the on-line BatchPLS methods; the
leave-one-out sweep adds about a minute.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The same twelve panels as the departure chart, with the median of the
other batches as the centre and 1.4826 times their median absolute
deviation as the scale, then smoothed with an EWMA (lambda 0.3). The raw
robust distance is drawn faint behind the smoothed line. Sits beside the
standard-deviation version on the book page rather than replacing it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
One figure instead of two: per tag and batch, the robust distance from
the other batches (median and 1.4826 MAD, EWMA-smoothed) solid and the
mean-and-standard-deviation distance dashed, with the band between plus
and minus two shaded. The separate robust PNG is removed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
The on-line BatchPLS methods and BatchMonitor options it uses land in
1.81.0, since 1.80.0 went to an unrelated release.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE

kgdunn commented Sep 5, 2026

Copy link
Copy Markdown
Owner Author

The two red script checks ("Against the PyPI release" and "Against process-improve main (advisory)") fail on the three batch case-study scripts only, at their imports: load_dupont, load_fmc, load_sbr and BatchMonitor exist only on the kgdunn/process-improve#537 branch, and the PyPI release does not carry BatchPCA at all. The other 23 scripts pass and 16 are skipped for the optional pyoptex dependency, as before.

Nothing in this repository can make those two jobs green: the main job passes once #537 merges, and the PyPI job once a release carries it. I am not changing anything here for them.


Generated by Claude Code

…ches onto model C

Every score plot now carries the fraction of the variance each component
explains on its axes (R2 of X per component; R2Y on the multiblock super
scores). The DuPont model C figure projects the 15 batches left out of
that model onto it and draws them on the T2-against-SPE panel, on
logarithmic axes, beside the 40 training batches.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…ity panel

The label sat against the cloud of composition values and could not be
read; parity_plot takes the batches whose label goes to the left.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…dots readable on the bars

The RMSEE curves are dropped from the mid-batch prediction figure, so the
four attribute lines are solid and the batch-4 band is two RMSEP at each
sample. The eight member dots on the group-contribution bars now have a
white face and a dark edge, so they read on the bars and on the background.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…e model centre

The arrow, labelled "contribution direction", shows the displacement the
group contribution plot decomposes. The score-plot helper gains label_left
(labels 39 and 47 sat on their neighbours) and legend_loc (the legend sat
on the group); other score plots are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…mple panel

The group-contribution figure keeps the per-tag bars with the member dots
on the left and shows, on the right, a 2x2 block of raw trajectories over
the first 30 samples for TempC-1, Press-3, Press-2 and Flow-2. The separate
raw-trajectory figure is retired. On the model B score plot the arrow now
starts at a square marker on the group's average point, with a smaller
label.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
… on its prediction figure

Batch 4, the batch nearest the average quality, is drawn in purple and
labelled on the score plot so the mid-batch prediction figure can refer
to it. That figure's band is now one RMSEP wide, and the particle-size
axis uses integer ticks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…ader line

The new SBR figure draws the spread of the on-line score estimates across
the 51 reference batches, relative to the spread of their final scores, on
a logarithmic axis: the quantity the per-sample Hotelling's T2 divides by.
On the DuPont model A score plot, batch 49 sits inside the central cloud,
so its label is now pulled clear of the points on a leader line, through a
new label_leader option on the shared score_plot helper.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…eighbours

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
Both panels now show each tag as a distance from the 51 normal batches at
that sample, in their standard deviations, so the zero line is the average
batch and the forecasts read as departures. The right panel no longer has
to start after the start-up transient.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…purple

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…atch colours

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…e it is made from

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
… the four anomalous batches

The unfolded block now carries ClockTime as its eleventh tag, so the loading
panel gains an eleventh tag, the complete batch with the largest SPE becomes
41 (its contribution figure replaces the batch-51 one) and the batch-13
overlay shows the clock time instead of the agitator power. Two figures are
new: the block scores of the batch multiblock PLS, one panel per block,
coloured by the plant's disposition with batches 2, 3, 6 and 7 labelled; and
the Zop contribution from those batches' nearest abnormal neighbours to them,
beside the raw collector level, clock time, dryer temperature and its set
point for both groups.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…block scores, R2 on the loading panels

Score plots of the FMC case are coded by the plant's disposition with a
colour and a marker shape per class (group_scatter in the shared helpers),
so the plots carry the classification the prose compares the models with.
Bar panels get the alternate shading the other contribution figures use
(the DuPont group contribution and the quality-PCA contributions).

The multiblock PLS on the two initial-condition blocks becomes a 2 x 2
figure whose bottom row shows the block scores: batch 20 inside the cloud
in the chemistry block and far outside it in the operating-condition
block, which replaces the per-block contribution numbers in the text.

The loading panels of the batch PCA carry the R2 of every cell after two
components on a second axis in orange, and two faint vertical lines at
samples 175 and 249 mark the three phases (tag_panels gains `secondary`
and `vlines`).

The batch-41 SPE contribution figure is replaced by batch 20's, now that
process-improve computes contributions for a batch with missing cells:
the missing samples are blank positions and the dryer pressure carries
half of the residual.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
… components

Regenerated after the process-improve fix to PCA.r2_per_variable_ on the
NIPALS path: the orange curve previously showed the share of the residual
that the second component explained, which read 0.07 for the collector
tank level where the cumulative R2 is 0.78.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…wider legends

The disposition markers are drawn at twice the side of a plain dot
(MARKER_CODED 112 against MARKER 28 points squared, the highlights in
proportion), because a triangle and a square need the size to be told
apart. The R2 per cell on the loading panels is drawn at 0.55 alpha
behind the loading. Legends with four entries sit in a 2 x 2 grid
(compact_legend in the shared helpers), which is wider and less tall; the
batch-PCA score legend moves to the upper left and the block-scores
figure gets one legend row under its three panels, because a wide legend
inside any of them covers data.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…mple SPE panel

The two vertical lines at samples 175 and 249 that the loading panels
carry now also mark the phase ends on the batch-20 overlay, the batch
13, 5 and 7 overlay, the raw panels of the anomalous-batches figure
(dashed mid-grey, drawn over the grey batches and under the highlighted
ones) and the per-sample panel of batch 20's SPE contributions (orange,
on top of the blue bars). phase_lines in the shared helpers draws them;
overlay_panels and contribution_triptych take a vlines option.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
… area

Purple triangles and magenta squares were hard to tell apart. The third
disposition class is now gold (#d4a017), which the palette validator
separates from purple, blue, orange and aqua under every colour-vision
deficiency it checks (worst pair 8.7 against aqua, above the 8 target).
A square fills its bounding box where a circle fills 78% of it, so
squares are drawn at 0.78 of the area, and no longer overwhelm.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…scores

Column 1 holds the super scores over the super weights; columns 2 and 3
hold the chemistry and operating-condition blocks, each with its block
scores above the block weights that define them (one labelled point per
variable, w1 against w2).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…ots' size

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
A PLS model has an R2 for each block, and a score plot whose axes read
"t1 [21.7%]" beside prose quoting the quality block's 41.0% invites the
reader to look for an error. The score_plot helper now writes R2X on the
axes of PLS-type models (the multiblock super scores already said R2Y),
and the block-score axes of the two multiblock figures say R2X too. The
SBR r2-over-time and weights panels pick up the earlier tag_panels
layout change.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
…axis

Two fixes from the review of the batch-PLS figure.

The shared style did not set axes.axisbelow, so matplotlib drew the grid
over the bars and markers wherever a call left the default z-order (the
batch-13 contribution bars most visibly). It is now set once in the
rcParams, for every figure in this family.

A PLS model has an R2 for each of its two blocks, and the score-plot axes
carried the X one while the pages quote the Y one, with nothing saying
which was which. The axes of every PLS-type score plot, and of the
multiblock block scores, now say R2X, matching the R2Y already on the
super scores.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LXthGpHLQFfGubBiKFtGAE
@kgdunn
kgdunn merged commit 645292f into main Sep 6, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants