Lucas Bianchi
2010-Jul-05 12:23 UTC
[R-es] Problemas para graficar barras de error y fechas en el eje-x (SOLUCIONADO)
Hola Carlos, afortunadamente, encontré una solución a mi problema (hasta ahora al menos me funciona, veremos si más adelante se me complica con alguna otra cosa) Llogré resolver el problema usando el parámetro "labels" de la función "axis()". Lo que hice es algo así: *datos <- read.table(....)* #en el archivo datos, tengo una columna con las fechas en formato julian hecha en la la planilla de cálculo (en mi caso Go-oo). #Para graficar, defino los rangos de cada eje *x1 <- as.integer(min(datos$julian)) x2 <- as.integer(max(datos$julian)) ejejx <- c(x1, x2) ejey <- range(datos$ch)* # y la solución que encontré a mi problema es esta: # Primero, a partir de las fechas en Julian de mi archivo datos, armo un vector con las posiciones donde irían las marcas en el # eje-x. *etiquetaJ <- seq(x1,x2, by=7)* # Luego, transformo esos valores a tipo Date y luego a tipo String para que puedan ser usados como etiquetas (no probé si como # tipo date alcanza, pero así funciona) *etiquetaC <- as.character(format(as.Date(etiquetaJ, origin="1899-12-30"), "%d/%m"))* # Es importante buscar el valor de "origin" adecuado, porque al transformar entre fechas de tipo Julian y Calendario, la # transformación se hace a partir de una fecha de origen que, aparentemente no es la misma para cada programa (Go-oo, R, MS-Excel, etc.) # yo fui probando hasta que llegue a que el origen que tenía que usar era 30/12/1899, suele ser 01/01/1900, no sé porque en este # caso lo tuve que atrasar dos días. # Ahora armo los ejes del gráfico *par(las=2, mgp=c(4, 1, 0), mai=c(1.2,1.2,0.5,0.5)) plot(ejejx,ejey, type="n", xaxt="n", xlab="Date", ylab="CH(%)")* # En la instrucción siguiente está la solución, le digo que ponga las marcas en el eje-x según el vector que armé con las fechas # Julian pero que las etiquetas las ponga con el vector que tiene las fechas tipo Calendario. *axis(1, at=seq(x1,x2, by=7), labels=etiquetaC)* # Listo, después de esto voy agregando los puntos para cada uno de los tipos que tengo dentro de datos, usando como referencia # los valores Julian *datos$tipo_num <- as.numeric(datos$tipo) n_tipo <- max(datos$tipo_num)* *for (i in 1:n_tipo) { tipo <- subset(datos, tipo_num==i) points(tipo$julian, tipo$ch, col=1, bg=8, pch=tipo$dibujo[1], cex=1.4)* # dibujo las líneas verticales de las barras de error *segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch-tipo$desv_std, col''black'') segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch+tipo$desv_std, col''black''*) #para que quede prolijo, también las lineas horizantales en cada uno de los extremos * segments(tipo$julian-0.5, tipo$ch-tipo$desv_std, tipo$julian+0.5, tipo$ch-tipo$desv_std, col= ''black'') segments(tipo$julian-0.5, tipo$ch+tipo$desv_std, tipo$julian+0.5, tipo$ch+tipo$desv_std, col= ''black'')* } Seguro que se puede mejorar un poco, pero funciona y me resuelve el problema, con el tiempo lo iré mejorando. Sé que se le pueden hacer unos cambios para que quede un poco más claro y breve, pero ahora estaba tratando de resolver el problemita este de las fechas y las barras de error. A mi me funcionó, espero que si alguien más se topa con este problema también le le sirva y si alguien conoce una forma mejor o más sencilla me encantaría conocerla. Saludos y Gracias!!! Lucas. El 2 de julio de 2010 19:01, Carlos Ortega <coforfe@gmail.com> escribió:> Hola Lucas, > > Sí, la solución pasaría entonces por utilizar las fechas en modo juliano, > pero en el gráfico utilizar como etiquetas las fechas en el formato que > quieres. A la hora de pintar puedes volver a pintar sobre el gráfico que ya > tienes pero con segments, creo que respetaría las posiciones x,y del plot. > > De todas formas, no consigo visualizar los diferentes grupos que pintas y > cómo sobre ellas debieran de aparecer las barras de error. > Me ayudaría más si pudieras adjuntar una imagen del gráfico que consigues > sin las barras de error y otro si es posible con las barras de error cuando > utilizas simplemente números. > > Saludos, > Carlos. > > 2010/7/2 Lucas Bianchi <bianchi_lucas@yahoo.com.ar> > >> Carlos, >> esa parece una buena solución, el problema lo sigo teniendo con la >> variable fecha. >> Al intentarlo con *segments()* o *arrows()* me dice "*primer argumento >> inválido*", o sea, estas funciones tampoco pueden trabajar con vectores >> tipo date. >> >> El problema con pasarlo a numérico es que no sé como hacerlo para que: >> 1) me respete las distancias en el tiempo, los datos que tengo no son >> todos equidistantes en el tiempo y, obviamente necesito que eso se vea en el >> gráfico. Supongo que transformando las fechas al tipo "*julian*" o algo >> similar eso debiera funcionar pero: >> 2) no quedaría bien que en el eje x aparezcan las fechas tipo julian sino >> que quisiera que aparezcan con el formato de dd/mm, por ejemplo >> ¿hay forma de combinar las dos cosas? intenté pero no pude. >> >> Supongo que si puedo lograr graficar convirtiendo las fechas a numéricas >> pero que en las etiquetas del eje aparezcan las fechas tipo calendario, >> podría solucionar el problema de las barras de error, ¿pero cómo lo hago? >> ¿es posible? >> >> saludos y Muchas gracias, >> Lucas. >> >> >> El 2 de julio de 2010 10:23, Carlos Ortega <coforfe@gmail.com> escribió: >> >> Hola, >>> >>> Creo que el error que estás teniendo es debido a que las funciones errbar >>> como plotCI no extienden sus métodos para considerar en las "x" vectores >>> tipo date. Tu variable "fecha" es de este tipo. Prueba a convertirla a >>> numérica (si tiene sentido). >>> >>> Prueba a utilizar "segments" y un ejemplo de su uso, justamente como >>> líneas de error, lo tienes en la función "barplot". >>> >>> ++++++++++++++++++ >>> hh <- t(VADeaths)[, 5:1] >>> mybarcol <- "gray20" >>> mp <- barplot(hh, beside = TRUE, >>> col = c("lightblue", "mistyrose", >>> "lightcyan", "lavender"), >>> legend = colnames(VADeaths), ylim= c(0,100), >>> main = "Death Rates in Virginia", font.main = 4, >>> sub = "Faked upper 2*sigma error bars", col.sub = mybarcol, >>> cex.names = 1.5) >>> segments(mp, hh, mp, hh + 2*sqrt(1000*hh/100), col = mybarcol, lwd >>> 1.5) >>> stopifnot(dim(mp) == dim(hh))# corresponding matrices >>> mtext(side = 1, at = colMeans(mp), line = -2, >>> text = paste("Mean", formatC(colMeans(hh))), col = "red") >>> >>> ++++++++++++++++++ >>> >>> >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> 2010/7/2 Lucas Bianchi <bianchi_lucas@yahoo.com.ar> >>> >>>> Estoy haciendo un gráfico de un valor llamado "ch" respecto del tiempo >>>> para >>>> distintas especies, no tengo inconvenientes hasta que quiero agregarle >>>> al >>>> gráfico unas barras de error, el código que tengo es el siguiente* >>>> >>>> datos <- read.table(......) >>>> x <- strptime(datos$fecha, "%e/%m/%y") >>>> y <- datos$ch >>>> >>>> *#Transformo a número cada uno de los tipos (factor)* >>>> datos$tipo_num <- as.numeric(datos$tipo) >>>> *#Determino cuántos tipos tengo* >>>> n_tipo <- max(datos$tipo_num) >>>> >>>> *#Defino los rangos de cada eje* >>>> ejex <- strptime(c("15/01/9","15/05/09"), "%d/%m/%y") >>>> ejey <- range(y) >>>> >>>> *#Armo los ejes del gráfico* >>>> par(las=2, mgp=c(4, 1, 0), mai=c(1.2,1.2,0.5,0.5)) >>>> plot(x,y, xaxt = "n", type="n", xlab="Date", ylab="Moisture Content >>>> (%)") >>>> axis.POSIXct(1,at=seq.POSIXt(from=ejex[1], to=ejex[2], by="weeks"), >>>> format="%d-%m") >>>> >>>> *#Agrego al gráfico los puntos para cada uno de los tipos* >>>> for (i in 1:n_tipo) { >>>> tipo <- subset(datos, tipo_num==i) >>>> fecha <- strptime(tipo$fecha, "%e/%m/%y") >>>> points(fecha, tipo$ch, col=1, bg=8, pch=tipo$dibujo[1], cex=1.4)}* >>>> >>>> Hasta acá todo bien, el problema surge cuando le quiero agregar las >>>> barras >>>> de error, >>>> probé con *errbar()* y con *plotCI()*, con las dos funciones tuve >>>> problemas >>>> al definir el eje de las x con lo que yo llamé "fecha" si en lugar de >>>> usar >>>> esa variable le paso un vector numérico no tengo problemas, pero por >>>> ejemplo >>>> al usar: >>>> >>>> *sd <- tipo$ch - 100 (esto es solo por poner algún valor de prueba) >>>> errbar( fecha, tipo$ch, tipo$ch + sd, tipo$ch - sd)* >>>> >>>> me dibuja los puntos pero no las barras de error >>>> >>>> o si uso: >>>> >>>> *plotCI(x=fecha, y=tipo$ch, uiw=20)* >>>> >>>> me aparece un mensaje que dice "...both x and y NULL..." >>>> si en este caso pusiera * >>>> >>>> plotCI(x=c(1:10)**, y=tipo$ch, uiw=20)* >>>> >>>> funciona perfecto. >>>> >>>> >>>> ¿Cuál es el problema con fecha? Porque además, usando exactamente el >>>> mismo >>>> parámetro con la función *points()* no tengo problemas. >>>> ¿hay una forma de solamente agregar las barras de error sin que se >>>> dibujen >>>> de nuevo los puntos o símbolos del gráfico? Esto es importante para mí >>>> porque tengo que diferenciar los símbolos para 5-6 especies diferentes. >>>> ¿existe alguna otra función que no sea alguna de las dos que estoy >>>> probando? >>>> >>>> Ya no sé que hacer, invertí muchas horas en tratar de solucionar esto y >>>> no >>>> encontré la forma, espero me puedan ayudar. >>>> Muchas Gracias, >>>> Lucas Bianchi. >>>> >>>> [[alternative HTML version deleted]] >>>> >>>> >>>> _______________________________________________ >>>> R-help-es mailing list >>>> R-help-es@r-project.org >>>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>>> >>>> >>> >> >[[alternative HTML version deleted]]
Lucas Bianchi
2010-Jul-05 17:41 UTC
[R-es] Problemas para graficar barras de error y fechas en el eje-x (SOLUCIONADO)
Hola Carlos, afortunadamente, encontré una solución a mi problema (hasta ahora al menos me funciona, veremos si más adelante se me complica con alguna otra cosa) Llogré resolver el problema usando el parámetro "labels" de la función "axis()". Lo que hice es algo así: *datos <- read.table(....)* #en el archivo datos, tengo una columna con las fechas en formato julian hecha en la la planilla de cálculo (en mi caso Go-oo). #Para graficar, defino los rangos de cada eje *x1 <- as.integer(min(datos$julian)) x2 <- as.integer(max(datos$julian)) ejejx <- c(x1, x2) ejey <- range(datos$ch)* # y la solución que encontré a mi problema es esta: # Primero, a partir de las fechas en Julian de mi archivo datos, armo un vector con las posiciones donde irían las marcas en el # eje-x. *etiquetaJ <- seq(x1,x2, by=7)* # Luego, transformo esos valores a tipo Date y luego a tipo String para que puedan ser usados como etiquetas (no probé si como # tipo date alcanza, pero así funciona) *etiquetaC <- as.character(format(as.Date(etiquetaJ, origin="1899-12-30"), "%d/%m"))* # Es importante buscar el valor de "origin" adecuado, porque al transformar entre fechas de tipo Julian y Calendario, la # transformación se hace a partir de una fecha de origen que, aparentemente no es la misma para cada programa (Go-oo, R, MS-Excel, etc.) # yo fui probando hasta que llegue a que el origen que tenía que usar era 30/12/1899, suele ser 01/01/1900, no sé porque en este # caso lo tuve que atrasar dos días. # Ahora armo los ejes del gráfico *par(las=2, mgp=c(4, 1, 0), mai=c(1.2,1.2,0.5,0.5)) plot(ejejx,ejey, type="n", xaxt="n", xlab="Date", ylab="CH(%)")* # En la instrucción siguiente está la solución, le digo que ponga las marcas en el eje-x según el vector que armé con las fechas # Julian pero que las etiquetas las ponga con el vector que tiene las fechas tipo Calendario. *axis(1, at=seq(x1,x2, by=7), labels=etiquetaC)* # Listo, después de esto voy agregando los puntos para cada uno de los tipos que tengo dentro de datos, usando como referencia # los valores Julian *datos$tipo_num <- as.numeric(datos$tipo) n_tipo <- max(datos$tipo_num)* *for (i in 1:n_tipo) { tipo <- subset(datos, tipo_num==i) points(tipo$julian, tipo$ch, col=1, bg=8, pch=tipo$dibujo[1], cex=1.4)* # dibujo las líneas verticales de las barras de error *segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch-tipo$desv_std, col''black'') segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch+tipo$desv_std, col''black''*) #para que quede prolijo, también las lineas horizantales en cada uno de los extremos * segments(tipo$julian-0.5, tipo$ch-tipo$desv_std, tipo$julian+0.5, tipo$ch-tipo$desv_std, col= ''black'') segments(tipo$julian-0.5, tipo$ch+tipo$desv_std, tipo$julian+0.5, tipo$ch+tipo$desv_std, col= ''black'')* } Seguro que se puede mejorar un poco, pero funciona y me resuelve el problema, con el tiempo lo iré mejorando. Sé que se le pueden hacer unos cambios para que quede un poco más claro y breve, pero ahora estaba tratando de resolver el problemita este de las fechas y las barras de error. A mi me funcionó, espero que si alguien más se topa con este problema también le le sirva y si alguien conoce una forma mejor o más sencilla me encantaría conocerla. Saludos y Gracias!!! Lucas. [[alternative HTML version deleted]]
Carlos Ortega
2010-Jul-06 07:58 UTC
[R-es] Problemas para graficar barras de error y fechas en el eje-x (SOLUCIONADO)
Hola Lucas, La transformación de las fechas a formato julian, puedes utilizar la librería "chron" que justamente contempla esta transformación y te indica claramente el origen para la transformación. De esta manera haces todo en R, y evitas cualquier manipulación adicional. Me alegro de que te haya funcionado finalmente. Saludos, Carlos. 2010/7/5 Lucas Bianchi <bianchi_lucas@yahoo.com.ar>> Hola Carlos, > afortunadamente, encontré una solución a mi problema (hasta ahora al menos > me funciona, veremos si más adelante se me complica con alguna otra cosa) > Llogré resolver el problema usando el parámetro "labels" de la función > "axis()". Lo que hice es algo así: > > *datos <- read.table(....)* > #en el archivo datos, tengo una columna con las fechas en formato julian > hecha en la la planilla de cálculo (en mi caso Go-oo). > #Para graficar, defino los rangos de cada eje > *x1 <- as.integer(min(datos$julian)) > x2 <- as.integer(max(datos$julian)) > ejejx <- c(x1, x2) > ejey <- range(datos$ch)* > # y la solución que encontré a mi problema es esta: > # Primero, a partir de las fechas en Julian de mi archivo datos, armo un > vector con las posiciones donde irían las marcas en el > # eje-x. > *etiquetaJ <- seq(x1,x2, by=7)* > # Luego, transformo esos valores a tipo Date y luego a tipo String para que > puedan ser usados como etiquetas (no probé si como > # tipo date alcanza, pero así funciona) > *etiquetaC <- as.character(format(as.Date(etiquetaJ, origin="1899-12-30"), > "%d/%m"))* > # Es importante buscar el valor de "origin" adecuado, porque al transformar > entre fechas de tipo Julian y Calendario, la > # transformación se hace a partir de una fecha de origen que, aparentemente > no es la misma para cada programa (Go-oo, R, MS-Excel, etc.) > # yo fui probando hasta que llegue a que el origen que tenía que usar era > 30/12/1899, suele ser 01/01/1900, no sé porque en este > # caso lo tuve que atrasar dos días. > # Ahora armo los ejes del gráfico > *par(las=2, mgp=c(4, 1, 0), mai=c(1.2,1.2,0.5,0.5)) > plot(ejejx,ejey, type="n", xaxt="n", xlab="Date", ylab="CH(%)")* > # En la instrucción siguiente está la solución, le digo que ponga las > marcas > en el eje-x según el vector que armé con las fechas > # Julian pero que las etiquetas las ponga con el vector que tiene las > fechas > tipo Calendario. > *axis(1, at=seq(x1,x2, by=7), labels=etiquetaC)* > # Listo, después de esto voy agregando los puntos para cada uno de los > tipos > que tengo dentro de datos, usando como referencia > # los valores Julian > *datos$tipo_num <- as.numeric(datos$tipo) > n_tipo <- max(datos$tipo_num)* > *for (i in 1:n_tipo) { > tipo <- subset(datos, tipo_num==i) > points(tipo$julian, tipo$ch, col=1, bg=8, pch=tipo$dibujo[1], cex=1.4)* > # dibujo las líneas verticales de las barras de error > *segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch-tipo$desv_std, col> ''black'') > segments(tipo$julian, tipo$ch, tipo$julian, tipo$ch+tipo$desv_std, col> ''black''*) > #para que quede prolijo, también las lineas horizantales en cada uno de > los extremos > * segments(tipo$julian-0.5, tipo$ch-tipo$desv_std, tipo$julian+0.5, > tipo$ch-tipo$desv_std, col= ''black'') > segments(tipo$julian-0.5, tipo$ch+tipo$desv_std, tipo$julian+0.5, > tipo$ch+tipo$desv_std, col= ''black'')* > } > > Seguro que se puede mejorar un poco, pero funciona y me resuelve el > problema, con el tiempo lo iré mejorando. Sé que se le pueden hacer unos > cambios para que quede un poco más claro y breve, pero ahora estaba > tratando > de resolver el problemita este de las fechas y las barras de error. > A mi me funcionó, espero que si alguien más se topa con este problema > también le le sirva y si alguien conoce una forma mejor o más sencilla me > encantaría conocerla. > > Saludos y Gracias!!! > Lucas. > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
Lucas Bianchi
2010-Jul-06 12:04 UTC
[R-es] Problemas para graficar barras de error y fechas en el eje-x (SOLUCIONADO)
Gracias Carlos, la voy a probar, yo uso mucho este tipo de gráficos por lo que de a poco, iré mejorando el código y supongo que terminará siendo una función a la que haya que pasarle unos cuantos parámetros y nada más. Saludos y gracias, Lucas. [[alternative HTML version deleted]]