Scatter plots | R Documentation |
scatter2D and scatter3D
plot a (2- or 3 dimensional) dataset with a color variable as points or lines.
text3D
plot a 3-D dataset with a color variable as text labels.
points3D
is shorthand for scatter3D(..., type = "p")
lines3D
is shorthand for scatter3D(..., type = "l")
points2D
is shorthand for scatter2D(..., type = "p")
lines2D
is shorthand for scatter2D(..., type = "l")
The 2D functions are included for their side effect of having a color key.
scatter3D (x, y, z, ..., colvar = z, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
colkey = NULL, panel.first = NULL,
clim = NULL, clab = NULL,
bty = "b", CI = NULL, surf = NULL,
add = FALSE, plot = TRUE)
text3D (x, y, z, labels, ..., colvar = NULL, phi = 40, theta = 40,
col = NULL, NAcol = "white", breaks = NULL,
colkey = NULL, panel.first = NULL,
clim = NULL, clab = NULL,
bty = "b", add = FALSE, plot = TRUE)
points3D (x, y, z, ...)
lines3D (x, y, z, ...)
scatter2D (x, y, ..., colvar = NULL,
col = NULL, NAcol = "white", breaks = NULL,
colkey = NULL, clim = NULL, clab = NULL,
CI = NULL, add = FALSE, plot = TRUE)
lines2D(x, y, ...)
points2D(x, y, ...)
text2D (x, y, labels, ..., colvar = NULL,
col = NULL, NAcol = "white", breaks = NULL, colkey = NULL,
clim = NULL, clab = NULL, add = FALSE, plot = TRUE)
x , y , z |
Vectors with x, y and z-values of the points to be plotted.
They should be of equal length, and the same length as |
colvar |
The variable used for coloring. For |
theta , phi |
the angles defining the viewing direction.
|
col |
Color palette to be used for coloring the |
NAcol |
Colors to be used for |
breaks |
a set of finite numeric breakpoints for the colors; must have one more breakpoint than color and be in increasing order. Unsorted vectors will be sorted, with a warning. |
colkey |
A logical, The default is to draw the color key on side = 4, i.e. in the right margin.
If |
CI |
A |
panel.first |
A |
clab |
Only if |
clim |
Only if |
bty |
The type of the box, the default draws only the back panels.
Only effective if the persp
argument ( |
labels |
The text to be written. A vector of length equal to length of x, y, z. |
surf |
If not |
add |
Logical. If |
plot |
Logical. If |
... |
additional arguments passed to the plotting methods. The following persp arguments can be specified:
In addition, the perspbox arguments
For all functions, the arguments In case The arguments after ... must be matched exactly. |
Function scatter3D
returns the viewing transformation matrix.
See trans3D.
For scatter2D
and scatter3D
the plottypes that are supported
are: type = "p"
, type = "l"
, type = "h"
,
type = "o"
. For type = "b"
, type = "o"
is used instead.
Karline Soetaert <karline.soetaert@nioz.nl>
persp for the function on which this implementation is based.
mesh, trans3D, slice3D
, for other examples of
scatter2D
or scatter3D
.
plotdev for zooming, rescaling, rotating a plot.
package scatterplot3D
for an implementation of scatterplots that is
not based on persp
.
# save plotting parameters
pm <- par("mfrow")
## =======================================================================
## A sphere
## =======================================================================
par(mfrow = c(1, 1))
M <- mesh(seq(0, 2*pi, length.out = 100),
seq(0, pi, length.out = 100))
u <- M$x ; v <- M$y
x <- cos(u)*sin(v)
y <- sin(u)*sin(v)
z <- cos(v)
# full panels of box are drawn (bty = "f")
scatter3D(x, y, z, pch = ".", col = "red",
bty = "f", cex = 2, colkey = FALSE)
## =======================================================================
## Different types
## =======================================================================
par (mfrow = c(2, 2))
z <- seq(0, 10, 0.2)
x <- cos(z)
y <- sin(z)*z
# greyish background for the boxtype (bty = "g")
scatter3D(x, y, z, phi = 0, bty = "g",
pch = 20, cex = 2, ticktype = "detailed")
# add another point
scatter3D(x = 0, y = 0, z = 0, add = TRUE, colkey = FALSE,
pch = 18, cex = 3, col = "black")
# add text
text3D(x = cos(1:10), y = (sin(1:10)*(1:10) - 1),
z = 1:10, colkey = FALSE, add = TRUE,
labels = LETTERS[1:10], col = c("black", "red"))
# line plot
scatter3D(x, y, z, phi = 0, bty = "g", type = "l",
ticktype = "detailed", lwd = 4)
# points and lines
scatter3D(x, y, z, phi = 0, bty = "g", type = "b",
ticktype = "detailed", pch = 20,
cex = c(0.5, 1, 1.5))
# vertical lines
scatter3D(x, y, z, phi = 0, bty = "g", type = "h",
ticktype = "detailed")
## =======================================================================
## With confidence interval
## =======================================================================
x <- runif(20)
y <- runif(20)
z <- runif(20)
par(mfrow = c(1, 1))
CI <- list(z = matrix(nrow = length(x), ncol = 2,
data = rep(0.05, times = 2*length(x))))
# greyish background for the boxtype (bty = "g")
scatter3D(x, y, z, phi = 0, bty = "g", CI = CI,
col = gg.col(100), pch = 18, cex = 2, ticktype = "detailed",
xlim = c(0, 1), ylim = c(0, 1), zlim = c(0, 1))
# add new set of points
x <- runif(20)
y <- runif(20)
z <- runif(20)
CI2 <- list(x = matrix(nrow = length(x), ncol = 2,
data = rep(0.05, 2*length(x))),
z = matrix(nrow = length(x), ncol = 2,
data = rep(0.05, 2*length(x))))
scatter3D(x, y, z, CI = CI2, add = TRUE, col = "red", pch = 16)
## =======================================================================
## With a surface
## =======================================================================
par(mfrow = c(1, 1))
# surface = volcano
M <- mesh(1:nrow(volcano), 1:ncol(volcano))
# 100 points above volcano
N <- 100
xs <- runif(N) * 87
ys <- runif(N) * 61
zs <- runif(N)*50 + 154
# scatter + surface
scatter3D(xs, ys, zs, ticktype = "detailed", pch = 16,
bty = "f", xlim = c(1, 87), ylim = c(1,61), zlim = c(94, 215),
surf = list(x = M$x, y = M$y, z = volcano,
NAcol = "grey", shade = 0.1))
## =======================================================================
## A surface and CI
## =======================================================================
par(mfrow = c(1, 1))
M <- mesh(seq(0, 2*pi, length = 30), (1:30)/100)
z <- with (M, sin(x) + y)
# points 'sampled'
N <- 30
xs <- runif(N) * 2*pi
ys <- runif(N) * 0.3
zs <- sin(xs) + ys + rnorm(N)*0.3
CI <- list(z = matrix(nrow = length(xs),
data = rep(0.3, 2*length(xs))),
lwd = 3)
# facets = NA makes a transparent surface; borders are black
scatter3D(xs, ys, zs, ticktype = "detailed", pch = 16,
xlim = c(0, 2*pi), ylim = c(0, 0.3), zlim = c(-1.5, 1.5),
CI = CI, theta = 20, phi = 30, cex = 2,
surf = list(x = M$x, y = M$y, z = z, border = "black", facets = NA)
)
## =======================================================================
## droplines till the fitted surface
## =======================================================================
with (mtcars, {
# linear regression
fit <- lm(mpg ~ wt + disp)
# predict values on regular xy grid
wt.pred <- seq(1.5, 5.5, length.out = 30)
disp.pred <- seq(71, 472, length.out = 30)
xy <- expand.grid(wt = wt.pred,
disp = disp.pred)
mpg.pred <- matrix (nrow = 30, ncol = 30,
data = predict(fit, newdata = data.frame(xy),
interval = "prediction")[,1])
# fitted points for droplines to surface
fitpoints <- predict(fit)
scatter3D(z = mpg, x = wt, y = disp, pch = 18, cex = 2,
theta = 20, phi = 20, ticktype = "detailed",
xlab = "wt", ylab = "disp", zlab = "mpg",
surf = list(x = wt.pred, y = disp.pred, z = mpg.pred,
facets = NA, fit = fitpoints),
main = "mtcars")
})
## =======================================================================
## Two ways to make a scatter 3D of quakes data set
## =======================================================================
par(mfrow = c(1, 1))
# first way, use vertical spikes (type = "h")
with(quakes, scatter3D(x = long, y = lat, z = -depth, colvar = mag,
pch = 16, cex = 1.5, xlab = "longitude", ylab = "latitude",
zlab = "depth, km", clab = c("Richter","Magnitude"),
main = "Earthquakes off Fiji", ticktype = "detailed",
type = "h", theta = 10, d = 2,
colkey = list(length = 0.5, width = 0.5, cex.clab = 0.75))
)
# second way: add dots on bottom and left panel
# before the scatters are drawn,
# add small dots on basal plane and on the depth plane
panelfirst <- function(pmat) {
zmin <- min(-quakes$depth)
XY <- trans3D(quakes$long, quakes$lat,
z = rep(zmin, nrow(quakes)), pmat = pmat)
scatter2D(XY$x, XY$y, colvar = quakes$mag, pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
xmin <- min(quakes$long)
XY <- trans3D(x = rep(xmin, nrow(quakes)), y = quakes$lat,
z = -quakes$depth, pmat = pmat)
scatter2D(XY$x, XY$y, colvar = quakes$mag, pch = ".",
cex = 2, add = TRUE, colkey = FALSE)
}
with(quakes, scatter3D(x = long, y = lat, z = -depth, colvar = mag,
pch = 16, cex = 1.5, xlab = "longitude", ylab = "latitude",
zlab = "depth, km", clab = c("Richter","Magnitude"),
main = "Earthquakes off Fiji", ticktype = "detailed",
panel.first = panelfirst, theta = 10, d = 2,
colkey = list(length = 0.5, width = 0.5, cex.clab = 0.75))
)
## =======================================================================
## text3D and scatter3D
## =======================================================================
with(USArrests, text3D(Murder, Assault, Rape,
colvar = UrbanPop, col = gg.col(100), theta = 60, phi = 20,
xlab = "Murder", ylab = "Assault", zlab = "Rape",
main = "USA arrests",
labels = rownames(USArrests), cex = 0.6,
bty = "g", ticktype = "detailed", d = 2,
clab = c("Urban","Pop"), adj = 0.5, font = 2))
with(USArrests, scatter3D(Murder, Assault, Rape - 1,
colvar = UrbanPop, col = gg.col(100),
type = "h", pch = ".", add = TRUE))
## =======================================================================
## zoom near origin
## =======================================================================
# display axis ranges
getplist()[c("xlim","ylim","zlim")]
# choose suitable ranges
plotdev(xlim = c(0, 10), ylim = c(40, 150),
zlim = c(7, 25))
## =======================================================================
## text3D to label x- and y axis
## =======================================================================
par(mfrow = c(1, 1))
hist3D (x = 1:5, y = 1:4, z = VADeaths,
bty = "g", phi = 20, theta = -60,
xlab = "", ylab = "", zlab = "", main = "VADeaths",
col = "#0072B2", border = "black", shade = 0.8,
ticktype = "detailed", space = 0.15, d = 2, cex.axis = 1e-9)
text3D(x = 1:5, y = rep(0.5, 5), z = rep(3, 5),
labels = rownames(VADeaths),
add = TRUE, adj = 0)
text3D(x = rep(1, 4), y = 1:4, z = rep(0, 4),
labels = colnames(VADeaths),
add = TRUE, adj = 1)
## =======================================================================
## Scatter2D; bty can also be set = to one of the perspbox alernatives
## =======================================================================
par(mfrow = c(2, 2))
x <- seq(0, 2*pi, length.out = 30)
scatter2D(x, sin(x), colvar = cos(x), pch = 16,
ylab = "sin", clab = "cos", cex = 1.5)
# other box types:
scatter2D(x, sin(x), colvar = cos(x), type = "l", lwd = 4, bty = "g")
scatter2D(x, sin(x), colvar = cos(x), type = "b", lwd = 2, bty = "b2")
# transparent colors and spikes
scatter2D(x, sin(x), colvar = cos(x), type = "h", lwd = 4, alpha = 0.5)
## =======================================================================
## mesh examples and scatter2D
## =======================================================================
par(mfrow = c(1, 2))
x <- seq(-1, 1, by = 0.1)
y <- seq(-2, 2, by = 0.2)
grid <- mesh(x, y)
z <- with(grid, cos(x) * sin(y))
image2D(z, x = x, y = y)
points(grid)
scatter2D(grid$x, grid$y, colvar = z, pch = 20, cex = 2)
## =======================================================================
## scatter plot with confidence intervals
## =======================================================================
par(mfrow = c(2, 2))
x <- sort(rnorm(10))
y <- runif(10)
cv <- sqrt(x^2 + y^2)
CI <- list(lwd = 2)
CI$x <- matrix (nrow = length(x), ncol = 2, data = rep(0.25, 2*length(x)))
scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)
scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI, type = "b")
CI$y <- matrix (nrow = length(x), ncol = 2, data = rep(0.05, 2*length(x)))
CI$col <- "black"
scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)
CI$y[c(2,4,8,10), ] <- NA # Some points have no CI
CI$x[c(2,4,8,10), ] <- NA # Some points have no CI
CI$alen <- 0.02 # increase arrow head
scatter2D(x, y, colvar = cv, pch = 16, cex = 2, CI = CI)
## =======================================================================
## Scatter on an image
## =======================================================================
par(mfrow = c(1, 1))
# image of oxygen saturation
oxlim <- range(Oxsat$val[,,1], na.rm = TRUE)
image2D(z = Oxsat$val[,,1], x = Oxsat$lon, y = Oxsat$lat,
contour = TRUE,
xlab = "longitude", ylab = "latitude",
main = "Oxygen saturation", clim = oxlim, clab = "%")
# (imaginary) measurements at 5 sites
lon <- c( 11.2, 6.0, 0.9, -4, -8.8)
lat <- c(-19.7,-14.45,-9.1,-3.8, -1.5)
O2sat <- c( 90, 95, 92, 85, 100)
# add to image; use same zrange; avoid adding a color key
scatter2D(colvar = O2sat, x = lon, y = lat, clim = oxlim, pch = 16,
add = TRUE, cex = 2, colkey = FALSE)
## =======================================================================
## Scatter on a contourplot
## =======================================================================
par(mfrow = c(1, 1))
# room for colorkey by setting colkey = list(plot = FALSE)
# contour plot of the ocean's bathymetry
Depth <- Hypsometry$z
Depth[Depth > 0] <- NA
contour2D(z = Depth, x = Hypsometry$x, y = Hypsometry$y,
xlab = "longitude", ylab = "latitude",
col = "black", NAcol = "grey", levels = seq(-6000, 0, by = 2000),
main = "Oxygen saturation along ship track",
colkey = list(plot = FALSE))
# add data to image; with a color key
scatter2D(colvar = O2sat, x = lon, y = lat, pch = 16,
add = TRUE, cex = 2, clab = "%")
## =======================================================================
## scatter2D for time-series plots
## =======================================================================
# Plotting sunspot 'anomalies'
sunspot <- data.frame(year = time(sunspot.month),
anom = sunspot.month - mean(sunspot.month))
# long-term moving average of anomaly
ff <- 100
sunspot$ma <- filter(sunspot$anom, rep(1/ff, ff), sides = 2)
with (sunspot, lines2D(year, anom,
colvar = anom > 0,
col = c("pink", "lightblue"),
main = "sunspot anomaly", type = "h",
colkey = FALSE, las = 1, xlab = "year", ylab = ""))
lines2D(sunspot$year, sunspot$ma, add = TRUE)
# The same
#with (sunspot, plot(year, anom,
# col = c("pink", "lightblue")[(anom > 0) + 1],
# main = "sunspot", type = "h", las = 1))
# but this does not work due to NAs...
# lines(sunspot$year, sunspot$ma)
## =======================================================================
## text2D
## =======================================================================
with(USArrests, text2D(x = Murder, y = Assault + 5, colvar = Rape,
xlab = "Murder", ylab = "Assault", clab = "Rape",
main = "USA arrests", labels = rownames(USArrests), cex = 0.6,
adj = 0.5, font = 2))
with(USArrests, scatter2D(x = Murder, y = Assault, colvar = Rape,
pch = 16, add = TRUE, colkey = FALSE))
# reset plotting parameters
par(mfrow = pm)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.