Skip to content

Support Hinton (triangle scorecard) plots#2219

Open
James Warner (jwarner8) wants to merge 5 commits into
mainfrom
hinton_plots
Open

Support Hinton (triangle scorecard) plots#2219
James Warner (jwarner8) wants to merge 5 commits into
mainfrom
hinton_plots

Conversation

@jwarner8

@jwarner8 James Warner (jwarner8) commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

While verpy will support a standard set of these plots, we want to have broader control on how to customise these (such as adding quantitative information to the plot, and not necessarily only be able to plot variables against lead-time).

Progress tracked in #2216

Microsoft CoPilot was used in constructing the function.

Contribution checklist

Aim to have all relevant checks ticked off before merging. See the developer's guide for more detail.

  • Documentation has been updated to reflect change.
  • New code has tests, and affected old tests have been updated.
  • All tests and CI checks pass.
  • Ensured the pull request title is descriptive.
  • Ensure rose-suite.conf.example has been updated if new diagnostic added.
  • Attributed any Generative AI, such as GitHub Copilot, used in this PR.
  • Marked the PR as ready to review.

@jwarner8 James Warner (jwarner8) added the enhancement New feature or request label Jun 24, 2026
@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor
Total coverage: 91% (HTML report)
Name                                                              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------------------------------------------
src/CSET/__init__.py                                                 93      2     12      0    98%
src/CSET/_common.py                                                 149      0     52      0   100%
src/CSET/cset_workflow/app/fetch_fcst/bin/fetch_data.py             115     27     24      0    79%
src/CSET/cset_workflow/app/finish_website/bin/finish_website.py      70      0      4      0   100%
src/CSET/cset_workflow/app/parbake_recipes/bin/parbake.py            29      0      8      0   100%
src/CSET/cset_workflow/app/send_email/bin/send_email.py              25      0      4      0   100%
src/CSET/cset_workflow/lib/python/jinja_utils.py                     17      0      6      0   100%
src/CSET/extract_workflow.py                                         47      0     16      0   100%
src/CSET/graph.py                                                    43      0     14      0   100%
src/CSET/operators/__init__.py                                       89      0     26      0   100%
src/CSET/operators/_atmospheric_constants.py                          9      0      0      0   100%
src/CSET/operators/_colormaps.py                                    205      4     54      4    97%
src/CSET/operators/_stash_to_lfric.py                                 3      0      0      0   100%
src/CSET/operators/_utils.py                                        183      9     74      7    94%
src/CSET/operators/ageofair.py                                      141      7     64      5    94%
src/CSET/operators/aggregate.py                                      76      1     22      1    98%
src/CSET/operators/aviation.py                                       60      0     18      0   100%
src/CSET/operators/collapse.py                                      154     12     72      5    91%
src/CSET/operators/constraints.py                                   107      7     46      2    93%
src/CSET/operators/convection.py                                     37      4     10      2    87%
src/CSET/operators/ensembles.py                                      27      0     14      0   100%
src/CSET/operators/filters.py                                        66      2     30      0    98%
src/CSET/operators/humidity.py                                       89      0     32      0   100%
src/CSET/operators/imageprocessing.py                                56      0     16      0   100%
src/CSET/operators/mesoscale.py                                      17      0      2      0   100%
src/CSET/operators/misc.py                                          146      0     54      1    99%
src/CSET/operators/plot.py                                         1007    175    340     64    79%
src/CSET/operators/power_spectrum.py                                 97      3     30      3    95%
src/CSET/operators/precipitation.py                                  93      0     50      0   100%
src/CSET/operators/pressure.py                                       41      0     12      0   100%
src/CSET/operators/read.py                                          409     38    178     14    89%
src/CSET/operators/regrid.py                                        122     18     64      1    83%
src/CSET/operators/scoreswrappers.py                                 47      6     12      3    85%
src/CSET/operators/temperature.py                                   121      0     32      0   100%
src/CSET/operators/transect.py                                       62      0     24      0   100%
src/CSET/operators/wind.py                                           17      0      4      0   100%
src/CSET/operators/write.py                                          15      0      6      0   100%
src/CSET/recipes/__init__.py                                        101      0     28      0   100%
---------------------------------------------------------------------------------------------------
TOTAL                                                              4185    315   1454    112    91%

@jwarner8

Copy link
Copy Markdown
Contributor Author

TODO:

  • Tidy up code and add comments.
  • Consult team on how best way to integrate a plotting function like this with other plot operators, which are focused on cubes.
  • Add basic tests to show that it produces a plot.

@jwarner8

Copy link
Copy Markdown
Contributor Author

James Frost (@jfrost-mo) this is some fairly standalone code that produces Hinton plots (independent of cubes). It doesn't really fit the conventional style of other operators here, but assume OK to be placed in plot.py for now? We can refactor it later (as we will more generally with plot.py)

@jfrost-mo

Copy link
Copy Markdown
Member

That should be fine; there is no rule that says plot operators must take a cube.

@jwarner8 James Warner (jwarner8) marked this pull request as draft June 30, 2026 12:19
@jwarner8 James Warner (jwarner8) marked this pull request as ready for review June 30, 2026 13:33
@jwarner8

Copy link
Copy Markdown
Contributor Author

Ready for a review now, with basic test for checking the function returns something other than None.

@jwarner8

Copy link
Copy Markdown
Contributor Author

TODO: this will mostly be useful once its tied into a recipe and producing a plot somewhere, but unclear how this will be linked yet into CSET, hence lodging the basic operator capability.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants