Description Usage Arguments Details Value Author(s) References See Also Examples
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
speeddirection ‘bins’ (e.g. 01, 12 m/s,... and 010,
1020 degrees etc.). To aid interpretation, gam
smoothing
is carried out using mgcv
.
1 2 3 4 5 6 7 8 9  polarPlot(mydata, pollutant = "nox", x = "ws", wd = "wd",
type = "default", statistic = "mean", resolution = "fine",
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, ws_spread = 15, wd_spread = 4,
kernel = "gaussian", tau = 0.5, ...)

mydata 
A data frame minimally containing 
pollutant 
Mandatory. A pollutant name corresponding to a
variable in a data frame should be supplied e.g. 
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 
It is also possible to choose Type can be up length two e.g. 
statistic 
The statistic that should be applied to each wind
speed/direction bin. Because of the smoothing involved, the
colour scale for some of these statistics is only to provide an
indication of overall pattern and should not be interpreted in
concentration units e.g. for

resolution 
Two plot resolutions can be set: “normal” and “fine” (the default), for a smoother plot. It should be noted that plots with a “fine” resolution can take longer to render. 
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 
uncertainty 
Should the uncertainty in the calculated
surface be shown? If 
percentile 
If

cols 
Colours to be used for plotting. Options include
“default”, “increment”, “heat”,
“jet” and 
weights 
At the edges of the plot there may only be a few
data points in each wind speeddirection interval, which could
in some situations distort the plot if the concentrations are
high. An alternative to downweighting these points they can be
removed altogether using 
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 > 1 because of the risk of removing
real data points. It is recommended to consider your data with
care. Also, the 
mis.col 
When 
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 
units 
The units shown on the polar axis scale. 
force.positive 
The default is 
k 
This is the smoothing parameter used by the 
normalise 
If 
key.header 
Adds additional text/labels to the scale key.
For example, passing the options 
key.footer 
see 
key.position 
Location where the scale key is to plotted.
Allowed arguments currently include 
key 
Fine control of the scale key via 
auto.text 
Either 
ws_spread 
An integer used for the weighting kernel spread for wind
speed when correlation or regression techniques are used. Default is

wd_spread 
An integer used for the weighting kernel spread for wind
direction when correlation or regression techniques are used. Default is

kernel 
Type of kernel used for the weighting procedure for when
correlation or regression techniques are used. Only 
tau 
The quantile to be estimated when 
... 
Other graphical parameters passed onto

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, groundlevel concentrations resulting from buoyant plumes from chimney stacks tend to peak under higher wind speed conditions. Conversely, groundlevel, nonbuoyant 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 highlevel 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. Pairwise statistics between two pollutants can also be
calculated.
The function can also be used to compare two pollutant species
through a range of pairwise statistics (see help on
statistic
) and Grange et al. (2016) (openaccess publication
link below).
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
in the package openair
. Second, the effect of setting a
minimum number of measurements in each wind speeddirection 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 speeddirection 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 95
intervals, which take account of the frequency of measurements.
Variants on polarPlot
include polarAnnulus
and
polarFreq
.
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.
David Carslaw
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), 12631270.
Carslaw, D.C., Beevers, S.D, Ropkins, K and M.C. Bell (2006). Detecting and quantifying aircraft and other onairport contributions to ambient nitrogen oxides in the vicinity of a large international airport. Atmospheric Environment. 40/28 pp 54245434.
Carslaw, D.C., & Beevers, S.D. (2013). Characterising and understanding emission sources using bivariate polar plots and kmeans clustering. Environmental Modelling & Software, 40, 325329. 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), 22372244.
UriaTellaetxe, I. and D.C. Carslaw (2014). Source identification using a conditional bivariate Probability function. Environmental Modelling & Software, Vol. 59, 19.
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. 91959205.
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), 45014507.
Grange, S. K., Carslaw, D. C., & Lewis, A. C. 2016. Source apportionment advances with bivariate polar plots, correlation, and regression techniques. Atmospheric Environment. 145, 128134. http://www.sciencedirect.com/science/article/pii/S1352231016307166
The openair package for many more functions for analysing air pollution data.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  # Use openair 'mydata'
# basic plot
polarPlot(openair::mydata, pollutant = "nox")
## Not run:
# polarPlots by year on same scale
polarPlot(openair::mydata, pollutant = "so2", type = "year", main = "polarPlot of so2")
# set minimum number of bins to be used to see if pattern remains similar
polarPlot(openair::mydata, pollutant = "nox", min.bin = 3)
# plot by day of the week
polarPlot(openair::mydata, pollutant = "pm10", type = "weekday")
# show the 95% confidence intervals in the surface fitting
polarPlot(openair::mydata, pollutant = "so2", uncertainty = TRUE)
# Pairwise statistics
# Pearson correlation
polarPlot(openair::mydata, pollutant = c("pm25", "pm10"), statistic = "r")
# Robust regression slope, takes a bit of time
polarPlot(openair::mydata, pollutant = c("pm25", "pm10"), statistic = "robust.slope")
# Least squares regression works too but it is not recommended, use robust
# regression
# polarPlot(openair::mydata, pollutant = c("pm25", "pm10"), statistic = "slope")
## End(Not run)

Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.