Skip to content

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.

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.

“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.

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.

Performance diagram schematic A unit square with Success Ratio on the x-axis and Probability of Detection on the y-axis. Curved iso-lines of Critical Success Index arc across the plot, a dashed 1:1 frequency-bias diagonal runs corner to corner, and a steeper dashed bias-equals-2 line leans toward the upper-left to mark over-forecasting. The perfect point sits in the upper-right corner, and two sample forecast points are placed inside. 0.2 0.4 0.6 0.8 bias = 1.0 bias = 2 (over-forecast) perfect A B Success Ratio (1 − FAR) → Probability of Detection → 0 1 0 1
Figure 1. The performance diagram. Solid grey arcs are equal-CSI curves; the dashed teal diagonal is perfect frequency bias (1.0). Forecast A beats B — it sits on a higher CSI curve and closer to the perfect upper-right corner.

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.

“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.

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.

Reliability diagram schematic A square plot with forecast probability on the x-axis and observed relative frequency on the y-axis. A dashed 45-degree diagonal marks perfect calibration, and a sample S-shaped forecast curve crosses it, sitting above the line at low probabilities and below it at high probabilities. perfectly calibrated under-confident over-confident Forecast probability → Observed relative frequency → 0 1 0 1
Figure 2. A reliability diagram. The dashed teal diagonal is perfect calibration; the blue curve is a sample forecast that is under-confident at low probabilities (above the line) and over-confident at high probabilities (below the line).

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).

“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.

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.

ROC diagram schematic A square plot with Probability of False Detection on the x-axis and Probability of Detection on the y-axis. A dashed diagonal no-skill line runs from lower-left to upper-right, and a sample ROC curve bows up toward the upper-left, with threshold markers along it. The area between the curve and the diagonal is lightly shaded. no-skill line threshold POFD (false positive rate) → POD (true positive rate) → 0 1 0 1
Figure 3. A ROC diagram. The dashed grey diagonal is the no-skill line; the blue curve bows toward the upper-left. Each marker is one probability threshold, and the shaded region between curve and diagonal grows with discrimination skill.

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.

“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.

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.

Taylor diagram schematic A quarter-circle polar plot. The radius is standard deviation, the angle from the horizontal axis is correlation. Concentric standard-deviation arcs are drawn, correlation rays fan out from the origin, a reference point sits on the horizontal axis, and a sample model point sits inside with a dashed line to the reference marking centered RMSE. 0.0 0.5 0.8 0.95 corr = 1.0 reference (obs) model centered RMSE Standard deviation → Standard deviation →
Figure 4. A Taylor diagram drawn as a quarter circle. Radius is standard deviation, angle is correlation. The teal reference point on the x-axis is the observations; the dashed line from the blue model point to the reference is the centered RMSE.

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.

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.

DiagramQuestionMET line typeKey columns / statistics
PerformanceDetection vs. false alarms (categorical)CTSPODY, FAR, CSI (SR = 1 − FAR)
ReliabilityCalibration of probabilitiesPCTPSTD_CALIBRATION, PSTD_BASER, PSTD_NI
ROCDiscrimination across thresholdsPCT or CTCPOD vs. POFD per threshold (roc_pct / roc_ctc)
TaylorMatch to observed climate (continuous)CNTFSTDEV, OSTDEV, PR_CORR

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.

  1. Produce the line type. Run Point-Stat or Grid-Stat so the .stat output contains the rows the diagram needs (CTS for performance, PCT for reliability/ROC, CTC for ROC, CNT for Taylor).
  2. 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.
  3. Write a custom YAML. Override the diagram’s defaults file — for example set stat_input (the input data path) and plot_filename (where the PNG is written), plus any reference-line or styling toggles.
  4. 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