Diagnostic diagrams
Verification scores are easy to compute and hard to feel. These four diagrams turn columns of statistics into a picture you can read at a glance: is my forecast detecting events, is it honestly calibrated, can it tell events from non-events, and does it match the observed climate? METplotpy draws all four from the line-type output that MET’s Point-Stat and Grid-Stat tools already produce.
How to use this page
Section titled “How to use this page”Each diagram below follows the same four-part shape so you can compare them: the question it
answers, the axes (what is plotted against what), how to read good vs. bad, and the
MET line type that feeds it. A line type is just the named row format MET writes into its
.stat output — for example a CTS row holds contingency-table statistics,
a PCT row holds a probability contingency table.
Every diagram is a small theme-reactive schematic, not a real data plot — the curves are illustrative so the geometry is clear. The captions point out the one feature that matters most.
1 · Performance diagram
Section titled “1 · Performance diagram”“Is my categorical forecast catching events without crying wolf?”
The performance diagram packs four categorical statistics into a single square. It shows the relationship between detecting events and avoiding false alarms, and — because of the geometry — it reveals frequency bias and Critical Success Index at the same time without you having to read them off a table.
Axes and reference lines
Section titled “Axes and reference lines”X-axis — Success Ratio, SR = 1 − FAR — How often a “yes” forecast was right. Higher is better; it runs left (bad) to right (good).
Y-axis — Probability of Detection, PODY — How often an observed event was forecast. Higher is better; it runs bottom (bad) to top (good).
CSI curves — Curves of equal Critical Success Index sweep from the top of the plot to the right side. A point sitting on a higher CSI curve is a better overall forecast.
Frequency-bias lines — Dashed lines radiating from the origin, labeled with their bias value. The 1:1 diagonal is perfect bias (1.0). Lines steeper than it (leaning toward the upper-left, high POD relative to success ratio) are bias > 1 — over-forecasting; lines shallower than it (toward the lower-right) are bias < 1 — under-forecasting.
What feeds it
Section titled “What feeds it”The simplest input is MET’s contingency-table statistics output — the CTS line
type — which can be produced by many MET tools (Point-Stat, Grid-Stat, and others). METplotpy reads the
PODY, FAR, and CSI columns from that columnar text and places each
forecast as a point on the square.
2 · Reliability diagram
Section titled “2 · Reliability diagram”“When I say 70%, does it happen 70% of the time?”
The reliability diagram is the calibration check for probabilistic forecasts. It plots the conditional bias of those forecasts: for each forecast-probability bin, it asks how often the event actually occurred. An honest forecast system that says “30% chance” should be right about 30% of the time — no more, no less.
Axes and the perfect line
Section titled “Axes and the perfect line”X-axis — forecast probability — The probability the forecast issued, binned (for example 0 through 0.9 in the documentation’s example).
Y-axis — observed relative frequency — The fraction of times the event was actually observed within that probability bin.
The 45° diagonal — perfect reliability — Where forecast probability equals observed frequency. A curve lying on this line is perfectly calibrated.
What feeds it
Section titled “What feeds it”Reliability is built from MET’s probability contingency table — the PCT line type,
read as columnar text output. The METplotpy reliability plotter references statistics such as
PSTD_CALIBRATION, PSTD_BASER, and PSTD_NI, and can optionally
overlay a no-skill line, a reference line, and a skill line via configuration toggles
(add_noskill_line, add_reference_line, add_skill_line).
3 · ROC diagram
Section titled “3 · ROC diagram”“Can my forecast tell events from non-events at all?”
The Receiver Operating Characteristic (ROC) diagram measures discrimination — the forecast’s ability to separate the days an event happens from the days it doesn’t, independent of calibration. The documentation describes it as plotting the true positive rate (sensitivity) against the false positive rate (1 − specificity) for different cut-off points of a parameter.
Axes and the no-skill line
Section titled “Axes and the no-skill line”Y-axis — Probability of Detection, POD (true positive rate / sensitivity) — The fraction of events correctly forecast as “yes.”
X-axis — Probability of False Detection, POFD (false positive rate / 1 − specificity) — The fraction of non-events incorrectly forecast as “yes.”
The curve — Each point is one decision cut-off (one probability threshold). Sweeping the threshold from strict to lenient traces the curve from the lower-left toward the upper-right.
What feeds it
Section titled “What feeds it”METplotpy can build a ROC curve from two MET line types: the probability contingency table
(PCT), where each row’s threshold gives one point on the curve, or contingency table
counts (CTC). The plotter exposes roc_pct and roc_ctc boolean
flags to choose the input mode. The source notes the data may first need reformatting via the METdataio
METreformat module before plotting.
4 · Taylor diagram
Section titled “4 · Taylor diagram”“How close is my model to the observed climate, all in one geometry?”
The Taylor diagram is the odd one out — it’s a polar plot for continuous fields, and it folds three statistics into a single point. It quantifies the correspondence between models and a “reference” (the observations) using the Pearson correlation coefficient, the centered RMSE, and the standard deviation, all at once.
The geometry
Section titled “The geometry”Angle — Pearson correlation coefficient — The azimuth around the arc encodes correlation: zero angle (along the x-axis) is correlation 1.0, and the angle opens up as correlation falls.
Radius — standard deviation — The distance from the origin is the (normalized) standard deviation of the model field, measuring how much variability it has compared with the observations.
Distance to the reference point — centered RMSE — The straight-line distance from a model point to the reference point equals the centered (pattern) root-mean-square difference — the quantity the Taylor geometry actually encodes (the source page calls it simply the RMSE). The reference sits on the x-axis at the observed standard deviation.
What feeds it
Section titled “What feeds it”The Taylor plotter reads MET’s continuous-statistics line type CNT from Point-Stat or
Grid-Stat (columnar text). The three statistics it needs are FSTDEV (forecast standard
deviation), OSTDEV (observation standard deviation), and PR_CORR (Pearson
correlation). The taylor_voc option controls whether the plot shows only positive
correlation values; when negative correlations are allowed the geometry extends past the vertical
(corr = 0) axis into a half-circle, so an anticorrelated model lands to the left of it. A
separate taylor_show_gamma toggle draws the standard-deviation arcs.
What feeds each diagram
Section titled “What feeds each diagram”The diagrams differ in what they ask, but they all start from MET line-type rows. This is the quick cross-reference: pick the diagram, find the line type, look for these columns.
| Diagram | Question | MET line type | Key columns / statistics |
|---|---|---|---|
| Performance | Detection vs. false alarms (categorical) | CTS | PODY, FAR, CSI (SR = 1 − FAR) |
| Reliability | Calibration of probabilities | PCT | PSTD_CALIBRATION, PSTD_BASER, PSTD_NI |
| ROC | Discrimination across thresholds | PCT or CTC | POD vs. POFD per threshold (roc_pct / roc_ctc) |
| Taylor | Match to observed climate (continuous) | CNT | FSTDEV, OSTDEV, PR_CORR |
From .stat to plot
Section titled “From .stat to plot”Each diagram is driven the same way: a default YAML the plotter loads automatically, plus a small custom YAML where you point at your data and name your output.
- Produce the line type. Run Point-Stat or Grid-Stat so the
.statoutput contains the rows the diagram needs (CTSfor performance,PCTfor reliability/ROC,CTCfor ROC,CNTfor Taylor). - Get the data into columnar form. METplotpy reads text output in columnar format; for some diagrams the rows are reshaped by the METdataio METreformat module first.
- Write a custom YAML. Override the diagram’s defaults file — for example set
stat_input(the input data path) andplot_filename(where the PNG is written), plus any reference-line or styling toggles. - Run the plotter and read the picture. Generate the diagram, then read it with the good-vs-bad rules above: upper-right for performance, on-the-diagonal for reliability, bowed-up for ROC, near-the-reference for Taylor.
A derived, human-readable re-presentation — not official documentation. Sources: Performance diagram · Reliability diagram · ROC diagram · Taylor diagram