7 Respuestas a preguntas frecuentes
En este capítulo se presentan las respuestas a preguntas frecuentes que tienen los usuarios de R sobre la construcción de gráficos personalizados.
7.1 ¿Cómo crear un gráfico vacío?
Es muy frecuente que se necesite crear un gráfico vacío para luego agregar ciertos elementos y construir un nuevo gráfico de forma incremental. Hacer esto en R es muy sencillo, solo se debe dibujar el gráfico con plot
incluyendo type='n'
para que no dibuje nada.
A continuación se presenta el código para crear un gráfico vacío con valores de X entre -5 y 5, valores de Y entre 0 y 1, sin nombres en los ejes. En el pánel izquierdo de la Figura 7.1 se muestra el gráfico resultante, no se observa nada adentro porque esa era la idea, un gráfico vacío. Es posible crear un gráfico más vacío aún, sin ejes ni la caja alrededor del gráfico. En el pánel derecho de la Figura 7.1 se muestra el gráfico resultante con un mensaje para alertar que no es un error en la figura.
par(mfrow=c(1, 2))
plot(c(-5, 5), c(0, 1), xlab="", ylab="", type='n')
plot(c(-5, 5), c(0, 1), xlab="", ylab="", type='n',
xaxt='n', yaxt='n', bty='n')
text(x=0, y=0.5,
label='Gráfico completamente vacío.')
7.2 ¿Cómo personalizar los valores a mostrar en los ejes?
Supongamos que tenemos un gráfico de dispersión y que queremos que el eje horizontal presente sólo tres marcas en los valores 2, 6 y 10, y que el eje vertical presente también tres marcas en los valores 0, 15 y 25.
Para realizar esto construimos el diagrama de dispersión de la forma usual con la función plot
pero le agregamos dentro lo siguiente xaxt='n', yaxt='n'
, esto se agrega para evitar que plot
coloque marcas en los ejes. Luego se usa la función axis(side, at, labels)
para colocar las marcas en cada uno de los ejes. Los parámetros básicos de la función axis
son:
side
: número para indicar el eje a completar, 1 para eje horizontal inferior, 2 para el eje vertical izquierdo, 3 para el eje horizontal superior y 4 para el eje vertical a la derecha.at
: vector con los puntos donde se desean las marcas.labels
: vector con las etiquetas a colocar en las marcas.
A continuación se muestra un ejemplo de cómo colocar tres marcas tanto en el eje horizontal como vertical. En la Figura 7.2 se muestra el resultado, a la izquierda está el diagrama obtenido por defecto y a la derecha el mismo diagrama pero con las tres marcas en los ejes.
x <- 1:10 # Los datos para el dibujo
y <- (x - 5) ^ 2 # Los datos para el dibujo
par(mfrow=c(1, 2)) # Para dividir la ventana gráfica
plot(x=x, y=y, main='Dibujo por defecto') # Dibujo por defecto
plot(x=x, y=y, xaxt='n', yaxt='n',
main='Con marcas personalizadas') # Sin marcas
axis(side=1, at=c(2, 6, 10), labels=c(2, 6, 10))
axis(side=2, at=c(0, 15, 25), labels=c(0, 15, 25))
7.3 ¿Cómo dibujar varios QQplot en una misma figura?
Para colocar varios QQplot en una misma figura lo primero que se debe hacer es aplicar la función qqnorm
a los datos pero usando plot.it=FALSE
para que no se dibuje nada, luego se almacenan los resultados en un objeto. Ese objeto resultante será una lista con las coordenadas de ubicación de los puntos. Se hace un gráfico vacío y sobre éste se colocar los puntos y las líneas de referencia.
Supongamos que tenemos dos muestras aleatorias m1
y m2
para las cuales queremos dibujar QQplots. El código para construir el gráfico solicitado se muestra a continuación y el resultado es la Figura 7.3.
m1 <- rnorm(n=15, mean=170, sd=10) # Simulando las muestras
m2 <- rnorm(n=20, mean=160, sd=15)
q1 <- qqnorm(m1, plot.it=FALSE)
q2 <- qqnorm(m2, plot.it=FALSE)
plot(range(q1$x, q2$x), range(q1$y, q2$y), type='n', las=1,
xlab='Theoretical Quantiles', ylab='Sample Quantiles')
points(q1, pch=19, col='slateblue3')
points(q2, pch=19, col='seagreen4')
qqline(m1, col='slateblue3')
qqline(m2, col='seagreen4')
legend('topleft', legend=c('Muestra 1', 'Muestra 2'), bty='n',
col=c('slateblue3', 'seagreen4'), pch=19)
7.4 ¿Cómo dibujar varias densidades en una misma figura?
Para dibujar varias densidades en una misma figura se procede de forma similar al ejemplo anterior. Se construyen las densidades pero sin dibujarlas, luego se crea un gráfico y se van agregando una a una las densidades. Abajo el código para dibujar dos densidades a partir de dos muestras aleatorias m1
y m2
. En la Figura 7.4 se muestran las dos densidades.
m1 <- rnorm(n=100, mean=3, sd=1) # Generando los datos
m2 <- rgamma(n=100, shape=2, scale=1)
f1 <- density(m1) # Calculando las densidades
f2 <- density(m2)
plot(f1, main='', las=1, lwd=2,
xlim=range(f1$x, f2$x), ylim=range(f1$y, f2$y),
xlab='Variable', ylab='Densidad')
lines(f2, lwd=2, col='red') # Para agregar f2
legend('topright', col=c('black', 'red'),
lwd=2, bty='n', legend=c('Muestra 1', 'Muestra2'))
7.5 ¿Cómo dibujar varias densidades transparentes en una misma figura?
Para dibujar varias densidades con colores transparentes se procede de forma similar al ejemplo anterior. Se construyen las densidades, luego se dibujan y por último se agregan polígonos que representan las densidades y para ellos se elige el color del fondo y del borde.
A continuación se repite la Figura 7.4 pero usando colores transparentes por medio de la función rgb
.
plot(f1, main='', las=1, lwd=2, type='n',
xlim=range(f1$x, f2$x), ylim=range(f1$y, f2$y),
xlab='Variable', ylab='Densidad')
polygon(f1, col=rgb(1, 1, 0, 0.7), border='black')
polygon(f2, col=rgb(0, 1, 1, 0.4), border='black')
7.6 ¿Cómo incluir una rejilla a una figura en ciertos puntos?
La función grid
explicada en la sección 6.7 se usa para incluir una cuadrícula o rejilla, sin embargo, no se le puede indicar los sitios donde queremos que aparezcan las líneas de referencia. La función abline
es útil en este caso.
A continuación se muestra el código de ejemplo para construir una rejilla que pase por los puntos -9, -6, -3, 0, 3, 6 y 9 del eje horizontal, y que pase por los puntos -10,-5, 0, 5 y 10 del eje vertical. Los parámetros v
y h
se usan para colocar el vector con las posiciones donde se desea la rejilla. El color de la rejilla se puede personalizar con el parámetro col
y el tipo de línea a dibujar con lty
. En la Figura 7.6 se observa el resultado.
plot(c(-10, 10), c(-10, 10), type="n", xlab="", ylab="")
abline(v=c(-9, -6, -3, 0, 3, 6, 9),
h=c(-10,-5, 0, 5, 10), col=gray(0.8), lty='dashed')
7.7 ¿Cómo incluir en un gráfico valores en forma automática?
Es frecuente que se necesite crear un gráfico en el que se incluya de forma automática el valor de un parámetro. Para estos casos se puede usar la función bquote
.
Vamos a simular 1000 observaciones de una distribución Poisson con \(\lambda=10\) y luego a crear un diagrama de barras para los valores de la muestra. El objetivo es colocar en el título \(\lambda=10\) de forma automática. El código para generar los datos y crear la figura se muestran a continuación. Observe que en main
se coloca bquote(lambda == .(media))
para indicar que se desea escribir la expresión con \(\lambda\) y que sea igual al valor almacenado en media
.
El mismo título se hubiese conseguido con main=expression(lambda == 10)
pero la idea era que el valor de \(\lambda\) apareciera de forma automática.
7.8 ¿Cómo incluir en un gráfico varios valores en forma automática?
Al igual que en el caso anterior se puede usar la función bquote
para evaluar valores dentro de una expresión.
Vamos a dibujar la densidad para una distribución \(N(150, 9)\). El objetivo es colocar en el título el nombre de la distribución y los valores de los parámetros de forma automática. El código para generar los datos y crear la figura se muestran a continuación. Observe que en main
se usa bquote
para crear la expresión y paste
para juntar lo que se evaluará con bquote
, el texto fijo se encierra dentro de comillas " "
.
mu <- 150
vari <- 9
curve(dnorm(x, mean=mu, sd=sqrt(vari)), from=130, to=170,
lwd=4, ylab='Density',
main=bquote(paste("Pdf for a normal with ",
mu, "=", .(mu),
" and ",
sigma^2, "=", .(vari))))
7.9 ¿Cómo incluir colores dependiendo de los valores de una variable cualitativa?
Esta pregunta es muy frecuente cuando se construyen diagramas de dispersión y el usuario desea colorear o diferenciar los puntos dependiendo de una variable cualitativa.
Como ejemplo vamos a construir un diagrama de dispersión para la longitud del sépalo y del pétalo de un grupo de flores con la información de la base de datos iris
. Se desea también que los puntos se puedan diferenciar con colores según la especie (setosa, versicolor y virginica) a la que pertenecen. Como son tres especies se eligen tres colores y luego se le indica a R que repita la secuencia de colores según la información almacenada en Species
, esto se consigue por medio del siguiente código: c('red', 'blue', 'green3')[Species]
, luego esto se coloca en el parámetro col
de la función plot
. A continuación el código completo para construir la Figura 7.9.
par(mar=c(1.8, 1.8, 1, 1), cex.axis=0.5)
with(iris, plot(x=Sepal.Length, y=Petal.Length, pch=19,
col=c('red', 'blue', 'green3')[Species]))
legend('topleft', legend=levels(iris$Species), cex=0.5,
col=c('red', 'blue', 'green3'), pch=19)
Hernández, F., and O. Usuga. 2018. Manual de R. Medellín, Colombia. https://fhernanb.github.io/Manual-de-R/.
Xie, Yihui. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. http://yihui.name/knitr/.
———. 2020. Bookdown: Authoring Books and Technical Documents with R Markdown. https://CRAN.R-project.org/package=bookdown.