# ROGER GUEVARA (roger.guevara@inecol.edu.mx)
# INSTITUTO DE ECOLOGIA A.C RED DE BIOLOGÍA EVOLUTIVA
# ESTADISTICA COMPUTACIONAL EN R
DATOS <- read.table("~/desktop/curso R 2012/TOLOACHE.csv", header = TRUE, sep = ",")
attach(DATOS)
names(DATOS)
## [1] "NOTAS" "NUM" "INVERNADERO" "LUZ"
## [5] "MICORRIZA" "SUELO" "HERBIVORIA" "RAIZ"
## [9] "TALLO" "HOJAS" "FLORES" "CAPSULAS"
## [13] "SEMILLAS" "INMADUROS" "PESO_TOTAL" "NUM_FLORES"
## [17] "DIAS_A_LA_FLOR" "FRUT_INMADUROS" "FRUT_MADUROS" "TOT_FRUTOS"
## [21] "ABORTOS" "ALT_TOT" "HOJAS_TOT" "DUREZA"
## [25] "AREA" "PESO_HOJAS" "AFE" "LONG_HIFAS"
## [29] "HIFAS" "ESPORAS" "VESICULAS" "ARBUSCULOS"
## [33] "TOTAL"
# Gráficos --------------------------- Para elaborar gráficos es
# importante definir primero algunos atributos del área donde se creará el
# gráfico usando la función << par() >>. Los argumentos mas importantes
# son, 1) El número de paneles que habrá, en filas y columnas lo cual hace
# con el argumento << mfrow = >> que se refiere 'multiple frame by rows'
# en el que se concatenan dos valores, el núemro de filas y el número de
# columnas que habrá en la figura. 2) Los márgenes de exteriores del área
# de la figura << mar= >> en el que se concatenan cuatro valores para el
# eje X, eje Y, eje X2 (superiro) y el eje Y2 (derecha). 3) La posición de
# las etiquetas de los ejes, valores de los ejes y de los ejes mismos <<
# mgp= >> en el que se concatenan tres valores que entre mayor sean
# desplazan hacia la izquierda cada uno de estos elementos del gráfico.
# Estos cambios hechos con << par() >> no se ven hasta que se cree un
# gráfico.
par(mfcol = c(1, 1), mar = c(5, 5, 2, 1), mgp = c(3, 1, 0))
# Ahora si mandamos un gráfico de dispersión en este caso con la << DUREZA
# >> y << AREA >> de las hojas.
plot(DUREZA, AREA)
# Ahora podemos ir editando las diferentes partes del gráfico, añadir o
# modificar las etiquetas de los ejes con los argumentos << xlab= >>,
# <<ylab= >>, del encabezado con <<main= >> y de un subtítulo del eje X
# con << sub= >>. En este caso para definir la etiqueta del eje Y usamos
# la función << expression() >> para pode colocar las unidades elevadas al
# cuadrado.
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo")
# Ahora podemos cambiar el tamaños de algunos de los elementos con los
# argumentos << cex = >>, <<cex.lab= >>, << cex.axis= >>, << cex.main= >>
# y << cex.sub >> para modificar los puntos, las etiquetas y los valores
# de los ejes, del encabezado y del sub título del eje X respectivamente.
# De entrada todos estos argumentos son igual a uno y número mayores a una
# aumenta el tamaño y número menores hace los componentes mas pequeños
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5)
# Podemos modificar los límites de la escala en los ejes con los
# argumentos << xlim= >> y << ylim= >> para el eje X y Y respectivamente.
# En cada uno de estos se deben concatenar dos valores indicando el mínimo
# y máximo en el eje que se desea.
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220))
# Ahora cambiamos el color de algunos de los elementos del gráfico con los
# argumentos <<col= >>, <<col.axis= >>, <<col.lab >>, << col.main= >> y <<
# col.sub= >>
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange")
# Ahora cambiaremos el tipo de viñeta que se representa en el gráfico con
# el argumento << pch= >> que recibe un valor entre 0 y 19
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19)
# Los diferentes símbolos que se pueden desplegar son los que se ilustran
# en este otro gráfico junto al valor numérico que los define en el
# argumento << pch= >>
plot(seq(0, 1, length = 20), rep(1, 20), pch = 0:20, axes = FALSE, ylab = "",
xlab = "", cex = 2)
text(seq(0, 1, length = 20), rep(1.05, 20), 0:19)
# Ahora aprenderemos modificar las valores que se muestran a lo largo de
# cada eje. Esto se hace en dos pasos. Primero dentro de la función <<
# plot() >> especificamos que el gráfico sea desplegado sin ejes con el
# argumentos << axes = FALSE >>
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = FALSE)
# A continuación agregamos cada uno de los ejes con la función << axis()
# >> en la que se especifica tres argumentos básicos; 1) El número de eje
# a representar. 2) Las etiquetas << lab= >> en el que e concatenan los
# valores o texto que se quiere desplegar en el eje, y 3) el argumento <<
# at= >> en el que se concatenan las coordenadas a lo largo del eje en el
# que se ubicarán las etiquetas. Obviamente la longitud de las
# concatenaciones en << lab= >> y << at= >> deben ser iguales.
axis(1, lab = c(0, 25, 50, 75, 100), at = c(0, 25, 50, 75, 100))
axis(2, lab = c(0, 55, 110, 165, 220), at = c(0, 55, 110, 165, 220))
# La orientación de los valores de los ejes pueden ser modificados con el
# argumento << las = >> que puede ser usado directamente dentro de la
# función << plot() >> cuando << axes= TRUE >> o no está especificado
# siendo << TRUE >> la opción por defecto. Los valores posibles para el
# argumento << las= >> son cero, uno, dos o tres
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = TRUE, las = 1)
# El mismo argumento << las= >> se puede usar dentro de la función <<
# axis= >> y puede tener valore de uno o dos para los ejes horizontales,
# eje 1 y eje 3. Y << las= >> toma los valores de cero o uno en los ejes
# verticales, eje 2 y ejes 4.
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = FALSE, las = 1)
axis(1, lab = c(0, 25, 50, 75, 100), at = c(0, 25, 50, 75, 100), las = 2)
axis(2, lab = c(0, 55, 110, 165, 220), at = c(0, 55, 110, 165, 220), las = 0)
# Dentro de la función << axis() >> se puede especificar también el color
# y tamaño con los mismo argumentos usados en << plot() >>, << cex.col= >>
# y << cex.axis= >>
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = FALSE, las = 1)
axis(1, lab = c(0, 25, 50, 75, 100), at = c(0, 25, 50, 75, 100), las = 2, cex.axis = 1.5,
col.axis = "purple")
axis(2, lab = c(0, 55, 110, 165, 220), at = c(0, 55, 110, 165, 220), las = 1,
cex.axis = 1.5, col.axis = "grey40")
# Ahora si queremos representar los puntos dentro del gráfico con
# diferentes colores (o figura) debemos también hacerlo en dos pasos. 1)
# definir un gráfico nulo con el argumento << type='n' >>, y 2 agregar los
# puntos para diferentes combinaciones de variables categóricas, por
# ejemplo << LUZ >> y << SUELO >>.
plot(DUREZA, AREA, xlab = "Dureza (g)", ylab = expression("Área foliar (" *
cm^2 * ")"), main = "TÍTULO", sub = "Subtitulo", cex = 0.6, cex.lab = 1.5,
cex.axis = 1.5, cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0,
220), las = 2, col = "red", col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = TRUE, las = 1, type = "n")
# Para agregar los puntos de diferentes colores definimos un objeto que
# contenga tantos colores como combinaciones de las variables categóricas
# que queremos representar. Definimos K igual a cero y dentro del bucle
# ira cambiando de valor, es como un contador. Con la función << levels()
# >> extraemos los niveles dentro de cada una de las variables
# categóricas, << LUZ >> y << SUELO >> para definirlos dentro de dos
# bucles anidados en los cuales se tendrá a la función << points() >> que
# es la que se usa para añadir puntos a un gráfico. Cada punto se define
# por las coordenadas en este caso de << DUREZ >> y << AREA >>, pero solo
# para los subconjuntos que correspondan a una de las combinaciones de los
# niveles de << LUZ >> y << SUELO >>
COLOR <- c("darkred", "darkblue", "darkgreen", "orange")
K <- 0
for (i in levels(LUZ)) {
for (j in levels(SUELO)) {
K <- K + 1
points(DUREZA[LUZ == i & SUELO == j], AREA[LUZ == i & SUELO == j], pch = 15,
col = COLOR[K], cex = 0.5)
}
}
# Varios paneles ---------------------------------
# Lo primero que hay que hacer es modificar el área del gráfico para
# indicarle que existan dos filas y dos columnas de paneles gráfico usando
# el argumento << mfrow=c(2, 2). En cada uno de los gráficos que se
# generan podemos editar sus componentes de la misma forma en que lo hemos
# hecho anteriormente. Donde definimos el nombre del título del gráfico
# usaremos la función << paste() >> para etiquetar de manera individual
# cada uno de los cuatro paneles.
par(mfrow = c(2, 2), mar = c(6, 6, 4, 1), mgp = c(3.5, 1, 0))
K <- 0
for (i in levels(LUZ)) {
for (j in levels(SUELO)) {
K <- K + 1
plot(DUREZA[LUZ == i & SUELO == j], AREA[LUZ == i & SUELO == j], xlab = "Dureza (g)",
ylab = expression("Área foliar (" * cm^2 * ")"), main = paste(i,
"&", j), sub = "Subtitulo", cex = 0.6, cex.lab = 1.5, cex.axis = 1.5,
cex.main = 2, cex.sub = 1.5, xlim = c(0, 100), ylim = c(0, 220),
las = 2, col = COLOR[K], col.axis = "darkblue", col.lab = "darkgreen",
col.main = "blue", col.sub = "orange", pch = 19, axes = TRUE, las = 1,
type = "p")
}
}
# Histograma de frecuencias ------------------------ Primero volvemos a
# editar la ventana gráfica para que contenga solo una figura
par(mfrow = c(1, 1), mar = c(4, 4, 2, 1), mgp = c(3, 1, 0))
# Vamos a usar la función << hist() >> que toma como argumento una
# variable continua
hist(DUREZA)
# Y podemos usar muchos de los argumentos ya definidos arriba para
# modificar el gráfico. Aqui solo ilustraremos aquellos que no hemos
# usado. El borde de las las barras lo podemos cambiar de color con el
# argumento << border= >> al cual se le asigna un color
hist(DUREZA, border = "darkblue")
# Las barras pueden ser de uno o mas colores concatenado los nombres de
# los colores al argumento << col= >>. Si el número de colores
# especificado es menor que el número de barras en el histograma los
# colores se reciclan
hist(DUREZA, border = "darkblue", col = c("darkred", "darkgreen"))
# La función de histograma esta predefinida para que las barras no
# presente achurado. Podemos incluir achurado con el argumento << density=
# >> que se refiere a la densidad de lineas que queremos mostrar dentro de
# las barras.
hist(DUREZA, border = "darkblue", col = c("darkred", "darkgreen"), density = 10)
# Y podemos especificar diferentes densidades de achurado para cada barra
# e igual que en el caso de los colores de ser necesario se reciclan estos
# valores
hist(DUREZA, border = "darkblue", col = c("darkred", "darkgreen"), density = c(5,
20))
# Podemos editar el ángulo en el que se muestran las lineas de achurado
# con el argumento << angle= >> y también de ser necesario se reciclará la
# información
hist(DUREZA, border = "darkblue", col = c("darkred", "darkgreen"), density = c(5,
20), angle = c(45, 90, 135))
# También podemos cambiar el número de barras en el histograma.
# Automáticamente R calcula el ámbito de las barras usando la regla de
# Sturges en la que la diferencia entre los valores máximo y mínimo de una
# variable es dividido por uno mas el logaritmo natural del número de
# datos. En este caso llevando el resultado al entero mínimo próximo
# tenemos el intervalo en las barras será de 10 unidades
(max(DUREZA) - min(DUREZA))/(1 + log(length(DUREZA)))
## [1] 10.87
# Para modificar el número de barras utilizaremos el argumento << breaks=
# >> al que se concatenan los límites de cada barra.
hist(DUREZA, border = "darkblue", col = c("darkred", "darkgreen"), density = c(5,
20), angle = c(45, 90, 135), breaks = c(20, 40, 60, 80, 100, 120))
# PASTELES ---------------------------------
PORCENTAJES <- c(10, 30, 40, 20)
# Para realizar una gráfica de pastel, simplemente necesitamos una
# colección de valores, usualmente relativos (%, proporción,
# probabilidad). Si los valores no son relativos R automáticamente calcula
# los valores relativos dividiendo cada valor entre la suma de todos
# ellos.
# Para hacer la gráfica de pastel ampliaremos el espacio gráfico
# minimizando los márgenes del mismo, en este caso definiéndolos como
# cero. El gráfico lo haremos con la función << pie() >> que usa una serie
# de argumentos ya definidos previamente
par(mar = c(0, 0, 0, 0))
pie(PORCENTAJES, labels = LETTERS[1:4], col = c("red", "blue", "green", "yellow"),
density = c(NA, 5, 10, 15), angle = c(NA, 45, 10, 80))
# y además existen los argumentos << labels= >> y << edges= >> para añadir
# o modificar las etiquetas de cada rebanada del pastel y cambiar la
# circularidad del mismo respectivamente. Si no se especifica otra cosa <<
# enges= >> tendrá un valor de 200.
pie(PORCENTAJES, col = c("red", "blue", "green", "yellow"), density = c(NA,
5, 10, 15), angle = c(NA, 45, 10, 80), labels = LETTERS[1:4], edges = 15)
# Gráficos de cajas y bigotes o cajas y alambres
# --------------------------------- La función << boxplot() >> utiliza
# todos los argumentos mostrados en los gráficos de dispersión
par(mar = c(4, 4, 1, 1))
# para una sola caja
boxplot(DUREZA)
# para un conjunto de cajas en función de los niveles de uno o mas
# factores
boxplot(DUREZA ~ LUZ * SUELO, col = 1:4, border = c("orange", rep(1, 3)))
# Gráfico de barras --------------------------------- Necesitamos un
# vector a matriz con las alturas de las barras.
MEDIAS <- tapply(DUREZA, list(LUZ, HERBIVORIA), mean)
# Si el objeto es una matriz o una tabla las barras dentro de cada columna
# será apiladas
barplot(MEDIAS)
# Pero con el argumento << besides= >> le indicamos que las barras de cada
# columna formen un grupo de barras contiguas.
barplot(MEDIAS, beside = TRUE)
# Para modificar los elementos del gráfico se usan los mismos argumentos
# definidos previamente. Siendo diferente únicamente el argumento <<
# names= >> al cual se concatenan los nombres de cada conjunto de barras
barplot(MEDIAS, beside = TRUE, names = c("Con herbivoría", "Sin herbivoría"))
# Barras con errores--------------------------------- Para las barras con
# error debemos definir dos objetos que pueden ser vectores o matrices.
# Uno de estos contendrá las medias y el segundo contendrá los errores.
# Además habrá que activar una función hecha en casa llamando al archivo
# << FUNCIONES.R >> usando la función << source() >>. Este archivo activa
# una función lalmada << barplot.error() >> que usa como argumentos las
# medias, los errores y todos aquellos descritos en los gráficos de
# dispersión
source("~/desktop/curso r 2012/FUNCIONES.R") #Recuerda cambiar la ruta
MEDIAS <- tapply(DUREZA, list(LUZ, HERBIVORIA), mean)
EE <- tapply(DUREZA, list(LUZ, HERBIVORIA), ee)
barplot.error(MEDIAS, EE)
# Espacios gráficos complejos ---------------------------------
# En R se pueden crear espacios gráficos muy complejos que acomoden varios
# paneles. Para esto necesitamos visualizar el espacio gráfico como una
# matriz con valores enteros en donde las celdas de la matriz con el mismo
# valor definirá cada uno de los paneles en el espacio gráfico.
MATRIZ <- matrix(c(1, 3, 3, 4, 4, 1, 3, 5, 5, 4, 2, 3, 5, 5, 4, 2, 3, 3, 4,
4), nrow = 5, ncol = 4)
MATRIZ
## [,1] [,2] [,3] [,4]
## [1,] 1 1 2 2
## [2,] 3 3 3 3
## [3,] 3 5 5 3
## [4,] 4 5 5 4
## [5,] 4 4 4 4
# Así esta matriz defines dos paneles superiores, 1 y 2, y abajo de estos
# dos paneles que ocupan todo el ancho del área gráfica , 3 y 4. Y
# embebido entre los paneles 3 y 4 se encuentra el panel cinco. La
# creación de este espacio gráfico la realizamos con la función <<
# layout() >>
layout(MATRIZ)
# y podemos visualizar el arregle con la función << layout.show() >> que
# tiene como argumento un valor que indica hasta que número de panel se
# quiere mostrar
layout.show(5)
# Ya con el espacio gráfico definido colocamos en el los gráficos que
# deseamos y estos erá ubicados e orden según los valores que definen cada
# panel en la matriz
par(mar = c(3, 3, 2, 2))
plot(DUREZA)
hist(DUREZA)
plot(DUREZA, AREA)
boxplot(DUREZA ~ LUZ)
pie(PORCENTAJES)