This Haywood plot shows the cumulative precipitation at Tucson International Airport for each water year since 1951. By default, the data is colored by the strength of El Nino (red) or La Nina (blue) in January and February of that year. The water year starts on October 1 of the previous year (e.g. 1951 spans October 1, 1950 through September 30, 1951).


Data sources

Precipitation data from comes from RCC-ACIS.

MEI data comes from NOAA ESRL. MEI v1 is used for 1951 - 1978. MEI v2 is used for 1979 - present.

ONI data comes from NOAA CPC.

PDO data comes from NOAA NCDC.

A python script fetches the MEI, ONI, and PDO data from the NOAA servers and formats it into simple csv files. The script runs periodically, so data may not always be up to date.

Advanced usage

Different observation locations 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.

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.

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 index month. 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.

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 the SVERI project with help from UA's CALS-CCT team.

The plot is made with d3js.

Will Holmgren
Assistant Research Professor
Department of Hydrology and Atmospheric Sciences
Institute for Energy Solutions
University of Arizona