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]]