R incluye muchas y variadas funciones para hacer gráficos. El sistema permite desde gráficos muy simples a figuras de calidad para incluir en artículos y libros.
Aquí sólo examinaremos la superficie. Si quieres más detalles para controlar todoas los aspectos de tus gráficos échale un vistazo al paquete ggplot2 o lattice. Hay un blog estupendo en el que, a través de 12 post, se presentan gráficos en uno y otro paquete, dicutiendo las bondades y debilidades de cada uno de ellos. Si te conformas con un buen conjunto de ejemplos simples, teclea en la consola demo(graphics).
plotSi escribimos plot(x,y) donde \( x \) e
\( y \) son vectores con \( n \) coordenadas, entonces R representa
el gráfico de dispersión con los puntos de coordenadas \( (x_i,y_i) \). Este comando incluye de forma predefinida una elección automática de ejes,
escalas, etiquetas de los ejes, densidad de las líneas, etc., que
pueden ser modificados añadiendo parámetros gráficos al comando y que pueden visualizarse con help(par).
x <- runif(50, 0, 4)
y <- runif(50, 0, 4)
plot(x, y, main = "Título principal", sub = "subtítulo", xlab = "eje x", ylab = "eje y",
xlim = c(0, 5), ylim = c(0, 5))
plotz <- cbind(x, y)
plot(z)
plot(y ~ x)
plot(log(y + 1) ~ x) # transformación de y
plot(x, y, type = "p")
plot(x, y, type = "l")
plot(x, y, type = "b")
plot(c(1, 5), c(1, 5))
legend(1, 4, c("uno", "dos", "tres"), lty = 1:3, col = c("red", "blue", "green"),
pch = 15:17, cex = 2)
Con text podemos representar caracteres de texto directamente:
sexo <- c(rep("v", 20), rep("m", 30))
plot(x, y, type = "n")
text(x, y, labels = sexo)
points(x, y, pch = 3, col = "red")
Tipos de puntos.
plot(c(1, 10), c(1, 3), type = "n", axes = FALSE, xlab = "", ylab = "")
points(1:10, rep(1, 10), pch = 1:10, cex = 2, col = "blue")
points(1:10, rep(2, 10), pch = 11:20, cex = 2, col = "red")
points(1:10, rep(3, 10), pch = 21:30, cex = 2, col = "blue", bg = "yellow")
plot(c(0, 10), c(0, 10), type = "n", xlab = "", ylab = "")
for (i in 1:10) {
abline(0, i/5, lty = i, lwd = 2)
}
lty permite especificaciones más complejas (longitud de los segmentos que son alternativamente dibujados y no dibujados). El parámetro par controla muchos parámetros gráficos. Por ejemplo, cex puede referirse a los labels (cex.lab), otro, cex.axis, a la anotación de los ejes, etc. Hay muchos más colores. Ver palette, colors.
La función identify\( (x,y,\textit{etiquetas}) \) identifica los puntos con el ratón y escribe la correspondiente etiqueta.
x <- 1:10
y <- sample(1:10)
nombres <- paste("punto", x, ".", y, sep = "")
plot(x, y)
identify(x, y, labels = nombres)
locator() devuelve las coordenadas de los puntos.
plot(x, y)
locator()
text(locator(1), "el marcado", adj = 0)
Empezamos con par(mfrow=c(filas,columnas)) antes del comando plot.
par(mfrow = c(2, 2))
plot(rnorm(10))
plot(runif(5), rnorm(5))
plot(runif(10))
plot(rnorm(10), rnorm(10))
Podemos mostrar muchos gráficos en el mismo dispositivo gráfico. La
función más flexible y sofisticada es split.screen, bien explicada
en R para principiantes, secc. 4.1.2 (p. 30).
Un diagrama de dispersión múltiple:
X <- matrix(rnorm(1000), ncol = 5)
colnames(X) <- c("a", "id", "edad", "loc", "weight")
pairs(X)
Gráficos condicionados (revelan interacciones):
Y <- as.data.frame(X)
Y$sexo <- as.factor(c(rep("Macho", 80), rep("Hembra", 120)))
coplot(weight ~ edad | sexo, data = Y)
coplot(weight ~ edad | loc, data = Y)
coplot(weight ~ edad | loc * sexo, data = Y)
La librería lattice permite lo mismo, y mucho más, que coplot. Ver secc. 4.6 de R para principiantes. Échale un vistazo a esta página graphics-side-by-side para realizar gráficos sofisticados en tus investigaciones.
Los diagramas de caja son muy útiles para ver rápidamente las principales características de una variable cuantitativa, o comparar entre variables.
attach(Y)
boxplot(weight)
plot(sexo, weight)
detach()
boxplot(weight ~ sexo, data = Y, col = c("red", "blue"))
La función boxplot tiene muchas opciones; se puede modificar el
aspecto, mostrarlos horizontalmente, en una matriz de boxplots, etc.
Véase la ayuda ?boxplot.
Los datos cuantitativos discretos pueden ser difíciles de ver bien.
Podemos añadir un poco de ruido con el comando jitter.
dc1 <- sample(1:5, 500, replace = TRUE)
dc2 <- dc1 + sample(-2:2, 500, replace = TRUE, prob = c(1, 2, 3, 2, 1)/9)
plot(dc1, dc2)
plot(jitter(dc1), jitter(dc2))
Podemos añadir muchos elementos a un gráfico, además de leyendas y líneas rectas.
x <- rnorm(50)
y <- rnorm(50)
plot(x, y)
lines(lowess(x, y), lty = 2)
plot(x, y)
abline(lm(y ~ x), lty = 3)
Podemos añadir otros elementos con panel functions en otras funciones (como pairs, lattice, etc).
Podemos modificar márgenes exteriores de figuras y entre figuras (véase ?par y búsquense oma, omi, mar, mai; ejemplos en An introduction to R, secc. 12.5.3 y 12.5.4.
También gráficos 3D: persp, image, contour; histogramas:
hist; gráficos de barras: barplot; gráficos de comparación de
cuantiles, usados para comparar la distribución de dos variables, o
la disribución de unos datos frente a un estándar (ej., distribución
normal): qqplot, qqnorm y, en paquete car, qq.plot.
Si queremos usar notación matemática usaremos plotmath y expresiones de texto arbitrariamente complejas en las coordenadas expression
x <- seq(-pi, pi, len = 65)
plot(x, sin(x), type = "l", col = 2, xlab = expression(phi), ylab = expression(f(phi)))
Si lo que necesitas son gráficos tridimensionales dinámicos échale un vistazo a XGobi y GGobi.
Podemos usar los menús y guardar con distintos formatos. También podemos especificar donde queremos guardar el gráfico:
pdf(file = "f1.pdf", width = 8, height = 10)
plot(rnorm(10))
dev.off()
O bien, podemos copiar una figura a un fichero.
plot(runif(50))
dev.copy2eps()