Temperature versus precipitation bullseye plot

Visualization of Uncertainty in Climate Models

Jeremy Walton1,2, Jennifer Pirret3, Veryan Horne4 and Joe Eyles3

1UKESM core group; 2Met Office Hadley Centre for Climate Science and Services, Exeter, UK; 3UK Applied Science, Met Office, Exeter UK; 4Operational Technology, Met Office, Exeter UK; 5Industry Science and Consultancy, Met Office, Exeter UK

The Met Office recently organized a sprint-hackathon aimed at building visualisations of climate data which could convey information to non-scientists in a way that is accessible and helpful.  The event attracted around thirty participants and began with a preparatory session which elicited ideas for potential topics.  Of the twenty-five which were proposed, six were selected as the most popular, and each was assigned to a team of around five developers.  Our team worked on visualizing climate model uncertainties; other teams looked at topics ranging from sea level rise to the economic impact of climate change.

Our idea was to show the spread of variable values calculated from different runs of a climate model using a bullseye or target.  The intention is to portray model uncertainty (as opposed to, for example, scenario uncertainty or interannual variability).  The closer the agreement between values, the more they would cluster near the centre of the bullseye. 

We began with a proof of concept using a toy dataset whose values are generated randomly in x and y in the range [-1, 1].  Figure 1 shows the dataset plotted in cartesian and polar space – that is, the mapping transforms the points from lying in a square to lying in a circle.  There’s a qualitative similarity between the locations of the points in each space: more specifically, it can be seen that the relative positions of the points aren’t changed by the transformation (see points 3, 12 and 19, for example), but the space is squashed to fit into the circle.  The +x and +y axes are transformed to the theta = 0 and 90 lines (see points 3, 4, 8 & 9); similarly -x and -y goes to theta = 180 and 270.  This means the quadrants are also preserved: (+x, +y) goes to the first quadrant (between theta = 0 and 90), for example.

Figure 1.  Two plots of a toy dataset.  Each data point comprises two random numbers drawn from the interval [-1, 1].  On the left, the points are plotted in cartesian (x,y) space; on the right, the same points are plotted in polar coordinates (i.e. each data point is transformed into the new space).

To demonstrate our idea using real data, we used 12 members of an ensemble of climate model runs using the HadGEM3-GC3.05 model, taken from the UK Climate Prediction (UKCP) Regional dataset for 1981-2000.  For each member, we calculated the difference between the member temporal mean value and the ensemble average for temperature and precipitation and plotted these differences in polar space (see Figure 2).  For each variable, the values plotted (which are differences from the average) sum to zero.  No rescaling of values has been done, so the broader spread in temperature reflects the numerical values of this quantity. 

Figure 2.  Difference between ensemble member value and ensemble mean value for temperature and precipitation plotted in polar coordinates.  Each point is labelled with ensemble member id; 12 members are plotted (members 2,3 and 14 from the original runs are missing).  

In our plot, we have filled in the annuli with the colours used in an archery target, in order to suggest this idea (or that of a bullseye) to the viewer.  Although colours have no other significance, and could perhaps be classified as “chartjunk” (i.e. visual elements which aren’t necessary for the comprehension of the information in a graph), we think they look appealing; in particular, members of our team who had limited experience with climate models found them illuminating.

Figures 1 and 2 were produced using python, calling the matplotlib library to perform the plotting and save the results as an image file.  An alternative representation of the same data is shown in Figure 3, which uses python calling the Bokeh library.  This saves the results of the plotting as an HTML file containing JavaScript which allows for interactive visualization in the web browser.  More specifically, the web page responds to mouseover events: as the user moves the mouse over different points, a popup appears containing information about data values and other information for that point (see Figure 3, where one of these events has been captured in the snapshot).

Figure 3.  The data from Figure 2, now plotted in a web browser.  Interaction – in this case, the use of mouseover events to identify points – has been added to the plot.

These visualizations provide a way of displaying one form of uncertainty in a climate model.  Extensions could include the display of results from other models or experiments (for example, those used in CMIP6), or the incorporation of other uncertainties by colouring the points. 

As noted, our visualizations were developed in the course of a sprint-hackathon, so the time allotted for development was no more than a few hours.  Other parts of the hackathon involved teams reviewing other teams’ code and documentation (all code was lodged on GitHub), which was very helpful.  Our team worked entirely remotely (other teams in the hackathon were entirely or partially collocated), but we didn’t perceive this as a disadvantage in collaboration.  We found the exercise to be a valuable experience, learning more about Teams, python, GitHub, visualization methods and climate modelling.