Vamos a trabajar con el conjunto de datos iris
head( iris ); str( iris )
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Representamos las dos primeras variables, Sepal.Length
y Sepal.Width
, coloreadas según la especie a la que pertenecen.
plot( iris[ , 1:2 ], col = iris$Species, pch = 20 ) # todas las especies
Vamos a llevar a cabo una serie de modificaciones sobre este gráfico.
Seleccionamos los datos:
iris[ iris$Species == "virginica" , ] # todas las variables de la especie virginica
iris[ iris$Species == "virginica" , 1:2 ] # longitud y anchura del sepalo
## Sepal.Length Sepal.Width
## 101 6.3 3.3
## 102 5.8 2.7
## 103 7.1 3.0
## 104 6.3 2.9
## 105 6.5 3.0
## 106 7.6 3.0
Hacemos su representación gráfica:
plot( iris[ iris$Species == "virginica" , 1:2 ], col = 3, pch = 20 )
Observamos que no es el mismo gráfico que el anterior eliminando las observaciones de setosa y versicolor, si no que los ejes cambian.
R
por defecto centra el gráfico en la media y busca representar la máxima dispersión a la hora de representarlos.
Para comparar las especies necesitamos tener la misma escala, por lo que hay que hacer el gráfico por pasos:
# Puntos de la especie virginica solamente
plot( iris[ , 1:2], type = "n" )
points( iris[ iris$Species == "virginica" , 1:2 ],
col = 3, pch = 20 )
Al usar la función plot()
con todos los datos, el device gráfico que lanza tiene las dimensiones que abarcan todo el gráfico. Al especificar type = "n"
no se pintan los puntos, lo que permite añadir con la función points()
sólo aquellos que queramos.
Como veremos en la próxima sesión, está es la forma automática que tiene de trabajar la librería de gráficos ggplot2
.
Primero calculamos los puntos medios:
m1 <- mean( iris[ iris$Species == "virginica", 1 ] ) # media longitud
m2 <- mean( iris[ iris$Species == "virginica", 2 ] ) # media anchura
Una vez calculados los podemos añadirlos al gráfico con el siguiente código:
# rectas de los puntos medios
abline( v = m1,
h = m2 ,
col = c( "blue", "red" ) )
# el punto medio
points( m1, m2,
col = c( "red" ),
pch = 20,
cex = 2 )
Lo juntamos todo:
# gráfico vacío
plot( iris[, 1:2],
type = "n",
xlab = "logitud (mm)",
ylab = "anchura (mm)")
# añado las obsevaciones de la especie virginica
points( iris[iris$Species == "virginica" , 1:2],
col = "green",
pch = 20 )
# trazamos las rectas de los puntos medios
abline( v = m1,
h = m2 ,
col = c( "blue", "red" ) )
# representamos el punto medio
points( m1, m2,
col = c( "red" ),
pch = 20,
cex = 2 )
Calculamos las medias para cada una de las especies:
aggregate( iris[, 1:4], list( iris$Species ), mean )
## Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 5.006 3.428 1.462 0.246
## 2 versicolor 5.936 2.770 4.260 1.326
## 3 virginica 6.588 2.974 5.552 2.026
# las guardamos en una variable
mediasIris <- aggregate( iris[, 1:4], list(iris$Species), mean )
Las añadimos al gráfico:
# representamos las medias
points( mediasIris[, 2:3],
pch = 20,
col = 2:4,
cex = 3 )
# las etiquetamos con el nombre de la especie
text( mediasIris[, 2:3],
as.character( mediasIris[, 1] ), # especies asociada a cada valor
pos = 1 )
Dejamos traza de la sesión:
sessionInfo()
## R version 3.4.3 (2017-11-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 17.10
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
##
## locale:
## [1] LC_CTYPE=es_ES.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=es_ES.UTF-8 LC_COLLATE=es_ES.UTF-8
## [5] LC_MONETARY=es_ES.UTF-8 LC_MESSAGES=es_ES.UTF-8
## [7] LC_PAPER=es_ES.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## loaded via a namespace (and not attached):
## [1] compiler_3.4.3 backports_1.1.1 magrittr_1.5 rprojroot_1.2
## [5] tools_3.4.3 htmltools_0.3.6 yaml_2.1.14 Rcpp_0.12.13
## [9] stringi_1.1.5 rmarkdown_1.7 knitr_1.17 stringr_1.2.0
## [13] digest_0.6.12 evaluate_0.10.1