The University of Arizona

This plot shows the cumulative precipitation at Tucson International Airport for each year since 1951. The data is colored by the strength of El Nino (blue) or La Nina (red) in that year, specifically the Jan-Feb Multivariate ENSO Index (MEI). The Tucson water year starts on October 1 of the previous year.


If your plot looks bad or doesn't load then try the static image. We recommend using Chrome, Safari, or Firefox to view this page. Mobile devices are not supported.

Data sources

Precipitation data from comes from RCC-ACIS.

MEI data comes from NOAA ESRL.

ONI data comes from a unofficial csv file. I'd prefer to use an official table, but I couldn't find a properly formatted csv or tsv file.

Advanced usage

Additional stations can be plotted by adding ?sid=my_identifier to the URL. Your identifier can be a preselected city or any valid RCC-ACIS sid identifier. Your local airport code will probably work. The NCDC maintains a long list of GHCN station identifiers, though data will not be available for every station. Preselected cities include: Tucson, Phoenix, Flagstaff, Yuma, Seattle, Portland, Los Angeles. See the javascript variable ids for a full list. (Would be nice if that list were automatically printed here...)

State averages can be plotted by adding ?state=my_identifier to the URL where the identifier is the state's two letter postal abbreviation. RCC-ACIS will take ~5 minutes to process these area average requests. Open your browser's debugger/developer tools to see if your request is still processing or if there was an error. I'll eventually add a loading/status dialog box.

The mean and median calculations will be wrong if the data record since 1950 is not complete.

It is possible to manually control the start, end, minimum, and maximum values of the plot, as well as the MEI month index. To do so, you'll need to open up your browser's debugger/developer tools and use the following functions in your javascript console.

To change the dates, use the command:

chart.months([startMonth, endMonth]).redraw()

Enter the months as integers (January = 1). The endMonth is inclusive. For example, to show data for only January 1 through March 31, use the command:


Unfortunately, you cannot currently plot data that spans a new water year, so ranges such as [9,10] do not work.

By default, the plot will automatically scale the y axis to include all of the data displayed. To turn off autoscaling, use:


The chart remembers its autoscale setting. Autoscaling may be turned on again using chart.autoscale(true).

The y axis range can be controlled with the yExtent function. For example, to change the range to 0 to 6 inches, use


The MEI month index can be accessed and set using the chart.ensoBin() function. For example, to change the MEI mapping to the May-June average, use the command:


The input parameter must be a column heading in the MEI table linked to above. If data for that bin for the most recent year is not yet available, then the most recent data that is available will be used.

The El Nino index can be toggled between the MEI and the more standard ONI using chart.ensoIndex(). You will also need to change the ensoBin setting since the indicies use different time averaging methods. For example:


The default color bin scheme can be changed to match the NOAA standard definition of neutral, weak, moderate, strong, and very strong ENSO conditions.


Combining the ONI with the NOAA color bin scheme yields a more standard analysis:


The chart.reset() function will reset the graph to the default settings.

All of these functions all return the chart, object, which enables them to be chained together as shown in the examples above. Most arguments are not case sensitive.

Many more getter-setter methods are available that provide fine control over the graph. See the source code for details.

These are new and relatively untested features, so you might run into problems. Please send me an email or report the issue on GitHub. In the future, I hope to add controls to the page for these features, which brings us to...

Open source

The source code for this site is on GitHub and released under the MIT license. This means that you can easily copy the code, play with it, contribute your improvements to this page, or use the code as the starting point or inspiration for your own tool. Here are some possible improvements:


Plot inspired by Mike Crimmins' excellent Monsoon plots and Ben McMahan and Mike's CLIMAS blog post.

Some of the graphing source code used on this site was originally developed for with help from UA's CALS-CCT team and funding from the SVERI utilities.

The plot is made with d3js.

Will Holmgren
DOE EERE Postdoctoral Fellow
Department of Atmospheric Sciences
Renewable Energy Network
University of Arizona