[R-es] Grafico de medias con barra de desviacion para varias series de datos
Argel Gastélum Arellánez
argel.gastelum en gmail.com
Lun Sep 24 19:38:34 CEST 2012
El 23/09/12 09:18, Eric escribió:
> Estimada comunidad, tengo el siguiente problema:
>
> Estoy haciendo un experimento de toxicidad de solventes para
> microalgas, por ahora tengo los datos de un solvente en 5 diferentes
> concentraciones y un control, cada unidad experimental tiene 3
> repeticiones, y necesito graficar las curvas de crecimiento del
> cultivo de algas. Tendria 6 curvas de crecimiento. Puse los datos en
> la tabla que adjunto como archivo .csv. La primera columna corresponde
> a los dias de crecimiento del alga y deberia ir en el eje X, la
> segunda columna indica la repeticion, la tercera columna indica el
> tipo de solvente usado ss=sin solvente y lim=limoneno, la columna con
> indica la concentracion del solvente y va de 1 a 5, la columna ABS es
> la medicion que se hizo e indica la absorbancia de la muestra.
>
> He intentado con PlotMeans y lattice pero no logro obtener el grafico
> que deseo. Es como si fuera necesario fundir esos dos paquetes para
> obtener loque necesito, ya que PlotMeans me permite graficar las
> medias con las barras de desviacion, pero no permite (al menos no he
> encontrado como) clasificar o diferenciar las concentraciones, por su
> lado con lattice puedo diferenciar las concentraciones pero no puedo
> graficar el promedio con las barras de desviacion (al menos no se como
> hacerlo) ... este es mi problema, alguna sugerencia ??
>
> Un abrazo a todos y gracias por su tiempo.
>
> Eric.
Hola Eric, ¿tal vez algo como esto es lo que necesitas?. Es un poco
largo y a mano, seguramente hay paquetes que lo hacen de forma mucho más
simplificada, espero te sirva... Saludos!
#-------------------------------------------------------------------------------
# Crecimiento de algas, efecto de solventes.
DATOS <- read.table("curvadecrecimientobraunii2.csv", header=T, sep="\t")
DATOS
class(DATOS$dia)
class(DATOS$con)
DATOS$con <- factor(DATOS$con)
class(DATOS$con)
class(DATOS$Abs)
#-------------------------------------------------------------------------------
# FUNCIÓN PARA CALCULAR MEDIAS Y DESVIACIONES ESTÁNDAR:
x.s <- function(respuesta = "", factor = "", datos, nombre.experimento =
"Nombre No Definido", nombre.respuesta = "Nombre No Definido",
nombre.factor = "Nombre No Definido"){
# Esta función calcula las "medias" y las "desviaciones estándar"
de una "variable de respuesta" para cada nivel de una "variable
explicativa" o "factor", mostrando los resultados en forma de una tabla.
# Preparar el marco de datos:
RESPUESTA <- datos[respuesta]
FACTOR <- datos[factor]
MARCO.DE.DATOS <- data.frame(FACTOR, RESPUESTA)
attributes(MARCO.DE.DATOS)$names <- c("FACTOR", "RESPUESTA")
cat("\n \n \n \n")
# Calcular las medias de la respuesta para cada nivel del factor.
medias <- c()
for(i in 1:length(levels(MARCO.DE.DATOS$FACTOR))){
medias <- c(medias,
mean(MARCO.DE.DATOS$RESPUESTA[MARCO.DE.DATOS$FACTOR ==
(levels(MARCO.DE.DATOS$FACTOR)[i])]))
}
# Calcular las desviaciones estándar de la respuesta
# para cada nivel del factor.
desv.est <- c()
for(i in 1:length(levels(MARCO.DE.DATOS$FACTOR))){
desv.est <- c(desv.est,
sd(MARCO.DE.DATOS$RESPUESTA[MARCO.DE.DATOS$FACTOR ==
(levels(MARCO.DE.DATOS$FACTOR)[i])]))
}
# Generar la tabla de datos:
tabla <- data.frame(medias, desv.est)
attributes(tabla)$row.names <- levels(MARCO.DE.DATOS$FACTOR)
attributes(tabla)$names <- c("Media", "Desviación estándar")
# Para que se muestre en consola el resultado, independientemente
de que se asigne el resultado a un objeto:
cat("\n ESTADÍSTICA DESCRIPTIVA \n", "\n EXPERIMENTO:",
nombre.experimento,
"\n RESPUESTA:", nombre.respuesta, "\n FACTOR:", nombre.factor,
"\n", "\n")
print(tabla)
# Para poder asignar el resultado a un objeto determinado:
return(list(TITULO = "ESTADÍSTICA DESCRIPTIVA", EXPERIMENTO =
nombre.experimento, RESPUESTA = nombre.respuesta, FACTOR =
nombre.factor, TABLA = tabla))
}
#-------------------------------------------------------------------------------
# Subset de datos para con = 0:
DATOS.indices.NO_con0 <- which(DATOS$con != c("0"))
DATOS.indices.NO_con0
DATOS.con0 <- DATOS[-DATOS.indices.NO_con0, ]
DATOS.con0
DATOS.con0$con <- factor(DATOS.con0$con)
DATOS.con0
# Verificando el tipo de dato para cada columna:
class(DATOS.con0)
class(DATOS.con0$dia)
DATOS.con0$dia <- factor(DATOS.con0$dia)
class(DATOS.con0$dia)
class(DATOS.con0$con)
class(DATOS.con0$Abs)
DESCRIPTIVA.con0 <- x.s(respuesta = "Abs", factor = "dia", datos =
DATOS.con0, nombre.experimento = "Solventes y crecimiento, con = 0",
nombre.respuesta = "Absorbancia", nombre.factor = "Tiempo (días)")
TABLA.con0 <- DESCRIPTIVA.con0$TABLA
TABLA.con0
#-------------------------------------------------------------------------------
# Subset de datos para con = 1:
DATOS.indices.NO_con1 <- which(DATOS$con != c("1"))
DATOS.indices.NO_con1
DATOS.con1 <- DATOS[-DATOS.indices.NO_con1, ]
DATOS.con1
DATOS.con1$con <- factor(DATOS.con1$con)
DATOS.con1
# Verificando el tipo de dato para cada columna:
class(DATOS.con1)
class(DATOS.con1$dia)
DATOS.con1$dia <- factor(DATOS.con1$dia)
class(DATOS.con1$dia)
class(DATOS.con1$con)
class(DATOS.con1$Abs)
DESCRIPTIVA.con1 <- x.s(respuesta = "Abs", factor = "dia", datos =
DATOS.con1, nombre.experimento = "Solventes y crecimiento, con = 1",
nombre.respuesta = "Absorbancia", nombre.factor = "Tiempo (días)")
TABLA.con1 <- DESCRIPTIVA.con1$TABLA
TABLA.con1
#-------------------------------------------------------------------------------
# Para graficar las barras de error con "errbar"
library(sfsmisc)
par(mar = c(5, 4, 2, 2) + 0.2) # Modifica los márgenes: c(bottom, left,
top, right), los valores por default son c(5, 4, 4, 2).
par(las=1) # Orientación de los números en los ejes: 0: always parallel
to the axis [default], 1: always horizontal, 2: always perpendicular to
the axis, 3: always vertical.
plot(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media,
axes = T, ylim = c(0, 250), xlab = list("Tiempo (días)", cex = 1.2, col
= "black", font = 2), ylab = list("Abs", cex = 1.2, col = "black", font
= 2), type = "n", col = "black", main = "Crecimiento vs tiempo", xlim =
c(0, 5), lwd = 2)
par(new=T) # Para graficar la nueva gráfica sobre la misma gráfica anterior.
errbar(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media,
yplus = TABLA.con0$Media + TABLA.con0[, 2], yminus = TABLA.con0$Media -
TABLA.con0[, 2], axes = F, ylim = c(0, 250), xlab = "", ylab = "", type
= "l", col = "black", main = "", xlim = c(0, 5), lwd = 2, lty = 1)
points(as.numeric(attributes(TABLA.con0)$row.names), TABLA.con0$Media,
cex = 1.2, pch = 21, col = "black", bg = "black")
par(new=T) # Para graficar la nueva gráfica sobre la misma gráfica anterior.
par(fg="blue")
errbar(as.numeric(attributes(TABLA.con1)$row.names), TABLA.con1$Media,
yplus = TABLA.con1$Media + TABLA.con1[, 2], yminus = TABLA.con1$Media -
TABLA.con1[, 2], axes = F, ylim = c(0, 250), xlab = "", ylab = "", type
= "l", col = "blue", main = "", xlim = c(0, 5), lwd = 2, lty = 2)
points(as.numeric(attributes(TABLA.con1)$row.names), TABLA.con1$Media,
cex = 1.2, pch = 21, col = "blue", bg = "blue")
#-------------------------------------------------------------------------------
legend(
"bottomright", # Posición en la gráfica.
legend = c( # Leyendas a colocar.
"con = 0",
"con = 1"
),
bty = "n", # Con borde "o", sin borde "n".
col = c("black", "blue"), # Color de línea y de borde de símbolo.
lty = c(1, 2), # Tipo de línea.
lwd = c(2, 2), # Grosor de línea.
pch = c(21, 21), # Tipo de símbolo.
pt.bg = c("black", "blue") # Color de relleno del símbolo.
)
#-------------------------------------------------------------------------------
Más información sobre la lista de distribución R-help-es