Learn R Programming

openair (version 1.0)

polarPlot: Bivariate polar plot with smoothing

Description

Function for plotting pollutant concentration in polar coordinates showing concentration by wind speed (or another numeric variable) and direction. Mean concentrations are calculated for wind speed-direction bins (e.g. 0-1, 1-2 m/s,... and 0-10, 10-20 degrees etc.). To aid interpretation, gam smoothing is carried out using mgcv.

Usage

polarPlot(mydata, pollutant = "nox", x = "ws", wd = "wd",
  type = "default", statistic = "mean", resolution = "normal",
  limits = NA, exclude.missing = TRUE, uncertainty = FALSE,
  percentile = NA, cols = "default", weights = c(0.25, 0.5, 0.75),
  min.bin = 1, mis.col = "grey", upper = NA, angle.scale = 315,
  units = x, force.positive = TRUE, k = 100, normalise = FALSE,
  key.header = "", key.footer = pollutant, key.position = "right",
  key = TRUE, auto.text = TRUE, ...)

Arguments

mydata
A data frame minimally containing wd, another variable to plot in polar coordinates (the default is a column ws --- wind speed) and a pollutant. Should also contain date if plots by time period are required.
pollutant
Mandatory. A pollutant name corresponding to a variable in a data frame should be supplied e.g. pollutant = "nox". There can also be more than one pollutant specified e.g. pollutant = c("nox", "no2"). The main use of using two or
x
Name of variable to plot against wind direction in polar coordinates, the default is wind speed, ws.
wd
Name of wind direction field.
type
type determines how the data are split i.e. conditioned, and then plotted. The default is will produce a single plot using the entire data. Type can be one of the built-in types as detailed in cutData e.g. season
statistic
The statistic that should be applied to each wind speed/direction bin. Can be mean (default), median, max (maximum), frequency. stdev (standard deviation), weight
resolution
Two plot resolutions can be set: normal (the default) and fine, for a smoother plot. It should be noted that plots with a fine resolution can take longer to render and the default option should be suffici
limits
The function does its best to choose sensible limits automatically. However, there are circumstances when the user will wish to set different ones. An example would be a series of plots showing each year of data separately. The limits are set in the form
exclude.missing
Setting this option to TRUE (the default) removes points from the plot that are too far from the original data. The smoothing routines will produce predictions at points where no data exist i.e. they predict. By removing the points too far fr
uncertainty
Should the uncertainty in the calculated surface be shown? If TRUE three plots are produced on the same scale showing the predicted surface together with the estimated lower and upper uncertainties at the 95interval. Calculating the uncertain
percentile
If statistic = "percentile" then percentile is used, expressed from 0 to 100. Note that the percentile value is calculated in the wind speed, wind direction bins. For this reason it can also be useful to set
cols
Colours to be used for plotting. Options include default, increment, heat, jet and RColorBrewer colours --- see the openair openColours function for
weights
At the edges of the plot there may only be a few data points in each wind speed-direction interval, which could in some situations distort the plot if the concentrations are high. weights applies a weighting to reduce their influence. For exa
min.bin
The minimum number of points allowed in a wind speed/wind direction bin. The default is 1. A value of two requires at least 2 valid records in each bin an so on; bins with less than 2 valid records are set to NA. Care should be taken when using a value >
mis.col
When min.bin is > 1 it can be useful to show where data are removed on the plots. This is done by shading the missing data in mis.col. To not highlight missing data when min.bin > 1 choose mis.col = "transparen
upper
This sets the upper limit wind speed to be used. Often there are only a relatively few data points at very high wind speeds and plotting all of them can reduce the useful information in the plot.
angle.scale
The wind speed scale is by default shown at a 315 degree angle. Sometimes the placement of the scale may interfere with an interesting feature. The user can therefore set angle.scale to another value (between 0 and 360 degrees) to mitigate su
units
The units shown on the polar axis scale.
force.positive
The default is TRUE. Sometimes if smoothing data with steep gradients it is possible for predicted values to be negative. force.positive = TRUE ensures that predictions remain positive. This is useful for several reasons. First,
k
This is the smoothing parameter used by the gam function in package mgcv. Typically, value of around 100 (the default) seems to be suitable and will resolve important features in the plot. The most appropriate choice of k
normalise
If TRUE concentrations are normalised by dividing by their mean value. This is done after fitting the smooth surface. This option is particularly useful if one is interested in the patterns of concentrations for several pollutants on
key.header
Adds additional text/labels to the scale key. For example, passing the options key.header = "header", key.footer = "footer1" adds addition text above and below the scale key. These arguments are passed to drawOpenKey via qu
key.footer
see key.footer.
key.position
Location where the scale key is to plotted. Allowed arguments currently include "top", "right", "bottom" and "left".
key
Fine control of the scale key via drawOpenKey. See drawOpenKey for further details.
auto.text
Either TRUE (default) or FALSE. If TRUE titles and axis labels will automatically try and format pollutant names and units properly e.g. by subscripting the `2' in NO2.
...
Other graphical parameters passed onto lattice:levelplot and cutData. For example, polarPlot passes the option hemisphere = "southern" on to cutData to provide southern (rather than default

Value

  • As well as generating the plot itself, polarPlot also returns an object of class ``openair''. The object includes three main components: call, the command used to generate the plot; data, the data frame of summarised information used to make the plot; and plot, the plot itself. If retained, e.g. using output <- polarPlot(mydata, "nox"), this output can be used to recover the data, reproduce or rework the original plot or undertake further analysis.

    An openair output can be manipulated using a number of generic operations, including print, plot and summary.

    polarPlot surface data can also be extracted directly using the results, e.g. results(object) for output <- polarPlot(mydata, "nox"). This returns a data frame with four set columns: cond, conditioning based on type; u and v, the translational vectors based on ws and wd; and the local pollutant estimate.

Details

The bivariate polar plot is a useful diagnostic tool for quickly gaining an idea of potential sources. Wind speed is one of the most useful variables to use to separate source types (see references). For example, ground-level concentrations resulting from buoyant plumes from chimney stacks tend to peak under higher wind speed conditions. Conversely, ground-level, non-buoyant plumes such as from road traffic, tend to have highest concentrations under low wind speed conditions. Other sources such as from aircraft engines also show differing characteristics by wind speed.

The function has been developed to allow variables other than wind speed to be plotted with wind direction in polar coordinates. The key issue is that the other variable plotted against wind direction should be discriminating in some way. For example, temperature can help reveal high-level sources brought down to ground level in unstable atmospheric conditions, or show the effect a source emission dependent on temperature e.g. biogenic isoprene.

The plots can vary considerably depending on how much smoothing is done. The approach adopted here is based on the very flexible and capable mgcv package that uses Generalized Additive Models. While methods do exist to find an optimum level of smoothness, they are not necessarily useful. The principal aim of polarPlot is as a graphical analysis rather than for quantitative purposes. In this respect the smoothing aims to strike a balance between revealing interesting (real) features and overly noisy data. The defaults used in polarPlot are based on the analysis of data from many different sources. More advanced users may wish to modify the code and adopt other smoothing approaches.

Various statistics are possible to consider e.g. mean, maximum, median. statistic = "max" is often useful for revealing sources.

Wind direction is split up into 10 degree intervals and the other variable (e.g. wind speed) 30 intervals. These 2D bins are then used to calculate the statistics.

These plots often show interesting features at higher wind speeds (see references below). For these conditions there can be very few measurements and therefore greater uncertainty in the calculation of the surface. There are several ways in which this issue can be tackled. First, it is possible to avoid smoothing altogether and use polarFreq. Second, the effect of setting a minimum number of measurements in each wind speed-direction bin can be examined through min.bin. It is possible that a single point at high wind speed conditions can strongly affect the surface prediction. Therefore, setting min.bin = 3, for example, will remove all wind speed-direction bins with fewer than 3 measurements before fitting the surface. Third, consider setting uncertainty = TRUE. This option will show the predicted surface together with upper and lower 95intervals, which take account of the frequency of measurements.

Variants on polarPlot include polarAnnulus and polarFreq.

References

Ashbaugh, L.L., Malm, W.C., Sadeh, W.Z., 1985. A residence time probability analysis of sulfur concentrations at ground canyon national park. Atmospheric Environment 19 (8), 1263-1270.

Carslaw, D.C., Beevers, S.D, Ropkins, K and M.C. Bell (2006). Detecting and quantifying aircraft and other on-airport contributions to ambient nitrogen oxides in the vicinity of a large international airport. Atmospheric Environment. 40/28 pp 5424-5434.

Carslaw, D.C., & Beevers, S.D. (2013). Characterising and understanding emission sources using bivariate polar plots and k-means clustering. Environmental Modelling & Software, 40, 325-329. doi:10.1016/j.envsoft.2012.09.005

Henry, R.C., Chang, Y.S., Spiegelman, C.H., 2002. Locating nearby sources of air pollution by nonparametric regression of atmospheric concentrations on wind direction. Atmospheric Environment 36 (13), 2237-2244.

Westmoreland, E.J., N. Carslaw, D.C. Carslaw, A. Gillah and E. Bates (2007). Analysis of air quality within a street canyon using statistical and dispersion modelling techniques. Atmospheric Environment. Vol. 41(39), pp. 9195-9205.

Yu, K.N., Cheung, Y.P., Cheung, T., Henry, R.C., 2004. Identifying the impact of large urban airports on local air quality by nonparametric regression. Atmospheric Environment 38 (27), 4501-4507.

See Also

polarCluster for identifying features in bivairate polar plots and for post processing and polarAnnulus, polarFreq, percentileRose for other ways of plotting directional data.

Examples

Run this code
# load example data from package
data(mydata)

# basic plot
polarPlot(mydata, pollutant = "nox")

# polarPlots by year on same scale
polarPlot(mydata, pollutant = "so2", type = "year", main = "polarPlot of so2")

# set minimum number of bins to be used to see if pattern remains similar
polarPlot(mydata, pollutant = "nox", min.bin = 3)

# plot by day of the week

polarPlot(mydata, pollutant = "pm10", type = "weekday")

# show the 95\% confidence intervals in the surface fitting
polarPlot(mydata, pollutant = "so2", uncertainty = TRUE)

Run the code above in your browser using DataLab