2012-08-28 20 views
9

Estoy en el proceso de crear una curva epidémica (histograma del número de casos de una enfermedad por día) usando R, y estoy luchando un poco formateando el eje x .Formateo del eje x del histograma al trabajar con fechas usando R

Soy consciente de que ggplot da muy buenos gráficos y ejes fácilmente manipulables (Understanding dates and plotting a histogram with ggplot2 in R), pero en este caso yo prefiero usar el comando hist(), porque yo estoy describiendo 2 patrones diferentes al mismo tiempo, como a continuación (I Don 't cree que puede hacer algo similar en ggplot):

enter image description here

el problema aquí es que el eje x no comienza en el primer caso, tiene demasiadas marcas de graduación, y me gustaría ser capaz de tener un marcador de fecha sistemática, ej. cada 7 días, o cada 1er. del mes.

Los datos se almacenan en una base de datos (dat.geo) como una fila por cada caso sospechoso, con información sobre la fecha de inicio y la zona residencial (ya sea negro o blanco en histograma), de la siguiente manera:

> head(dat.geo) 
    number age sex  suburb Date_of_Onset 
1  1 12 F   x 2011-10-11 
2  2 28 M   x 2011-10-10 
3  3 15 F   x 2011-10-12 
4  4 12 M   y 2011-10-25 
5  5 10 F   x 2011-10-15 
6  6 9 M   y 2011-10-20 

aquí está mi código:

pdf(file='1.epi.curve.pdf') 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="x")], "days", 
format = "%d %b %y", freq=T, col=rgb(0,0,0,1), axes=T, main="", add=T) 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="y")], "days", 
format = "%d %b %y", freq=T, main="", col=rgb(1,1,1,.6), add=T, axes=F) 
dev.off() 

he intentado suprimir el eje y la adición de un ser manipulado posteriormente utilizando este código

axis(1, labels=T) 
axis(2) 

pero esto es lo que me pasa (y no tengo ni idea de cómo manipular eso):

enter image description here

Su ayuda es muy apreciada!

gracias

+0

Use 'axis (1, at = x, labels = y)' donde 'x' son las coordenadas de los ticks (vector numérico) y' y' son las etiquetas de ticks (vector de caracteres). – Backlin

+0

Puede usar 'position =" identity "' en 'ggplot' para superponer las barras – James

Respuesta

16

Ya que nos desafían con eficacia para proporcionar una solución ggplot, aquí está:

dates <- seq(as.Date("2011-10-01"), length.out=60, by="+1 day") 

set.seed(1) 
dat <- data.frame(
    suburb <- rep(LETTERS[24:26], times=c(100, 200, 300)), 
    Date_of_Onset <- c(
    sample(dates-30, 100, replace=TRUE), 
    sample(dates, 200, replace=TRUE), 
    sample(dates+30, 300, replace=TRUE) 
) 
) 

library(scales) 
library(ggplot2) 
ggplot(dat, aes(x=Date_of_Onset, fill=suburb)) + 
    stat_bin(binwidth=1, position="identity") + 
    scale_x_date(breaks=date_breaks(width="1 month")) 

Nota el uso de position="identity" para obligar a cada barra que se originan en el eje, de lo contrario se obtiene una gráfico apilado por defecto.

enter image description here

+0

Gracias por su esfuerzo, eso se ve bien, pero prefiero la solución original para este problema en particular, porque puede ver las dos curvas en su totalidad. Recordaré esta técnica para uso futuro, aunque –

+0

@jpolonsky ¿Puedes explicar lo que quieres decir con * ver las dos curvas en su totalidad *? ¿Propones apilar los bares? ¿O para esquivar los barrotes? ¿O algo mas? Cualquiera de estas opciones es posible en 'ggplot' también. – Andrie

+1

Mis disculpas, acabo de ver que al agregar alfa = 0.5 al comando stat_bin, puede obtener transparencias, que era realmente lo que buscaba. Gracias por esta excelente solución! –

8

Hay 2 soluciones disponibles; 1 usando hist() y el otro usando ggplot():

library(date) 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="x")], "weeks", 
format = "%d %b %y", freq=T, col=rgb(0,0,0,1), axes=F, main="") 
hist(dat.geo$Date_of_Onset[(dat.geo$suburb=="y")], "weeks", 
format = "%d %b %y", freq=T, main="", col=rgb(1,1,1,.6), add=T, axes=F) 
axis.Date(1, at=seq(as.Date("2011-10-10"), as.Date("2012-03-19"), by="2 weeks"), 
format="%d %b %y") 
axis.Date(1, at=seq(as.Date("2011-10-10"), as.Date("2012-03-19"), by="weeks"), 
labels=F, tcl= -0.5) 

Esta curva epidémica es la siguiente:

enter image description here

una solución utilizando ggplot, sugerida por Andrie anteriormente, es el siguiente:

library(scales) 
library(ggplot2) 
ggplot(dat.geo,aes(x=Date_of_Onset, group=suburb, fill=suburb))+ 
stat_bin(colour="black", binwidth=1, alpha=0.5, 
position="identity") + theme_bw()+ 
xlab("Date of onset of symptoms")+ 
ylab("Number of cases")+ 
scale_x_date(breaks=date_breaks("1 month"), labels=date_format("%b %y")) 

que da una curva epidémica como a continuación:

enter image description here

Cuestiones relacionadas