-
Notifications
You must be signed in to change notification settings - Fork 20
/
50_respuestas.Rmd
152 lines (111 loc) · 10.3 KB
/
50_respuestas.Rmd
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Respuestas a preguntas frecuentes {#respuestas}
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.
## ¿Cómo crear un gráfico vacío? {#emptygraph}
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 \@ref(fig:empty1) 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 \@ref(fig:empty1) se muestra el gráfico resultante con un mensaje para alertar que no es un error en la figura.
```{r empty1, fig.cap='Ejemplo de gráfico vacío.', fig.asp=0.6, fig.width=8}
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.')
```
## ¿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 \@ref(fig:faq1) 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.
```{r faq1, fig.cap='Personalizando los valores a mostrar en los ejes.', fig.asp=0.6, fig.width=7}
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))
```
## ¿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 \@ref(fig:faq2).
```{r faq2, fig.cap='QQplots simultáneos.', fig.asp=1, fig.width=4}
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)
```
## ¿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 \@ref(fig:faq3) se muestran las dos densidades.
```{r faq3, fig.cap='Densidades simultáneas.', fig.asp=0.7, fig.width=4}
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'))
```
## ¿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 \@ref(fig:faq3) pero usando colores transparentes por medio de la función `rgb`.
```{r faq31, fig.cap='Densidades transparentes.', fig.asp=0.7, fig.width=4}
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')
```
## ¿Cómo incluir una rejilla a una figura en ciertos puntos? {#rejper}
La función `grid` explicada en la sección \@ref(grid) 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 \@ref(fig:rejilla) se observa el resultado.
```{r rejilla, fig.cap='Rejilla personalizada.', fig.asp=1, fig.width=3.5}
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')
```
## ¿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`.
```{r faq4, fig.cap='Ejemplo 1 con bquote.', fig.asp=0.7, fig.width=4}
media <- 10
x <- rpois(n=1000, lambda=media)
barplot(table(x), main=bquote(lambda == .(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.
## ¿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 `" "`.
```{r faq5, fig.cap='Ejemplo 2 con bquote.', fig.asp=0.7, fig.width=4}
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))))
```
## ¿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 \@ref(fig:faq6).
```{r faq6, fig.cap='Ejemplo para incluir colores dependiendo de los valores de una variable cualitativa.', fig.asp=0.7, fig.width=3.5}
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)
```