2012-08-28 16 views
9

Ich bin dabei, eine epidemische Kurve (Histogramm der Anzahl der Fälle einer Krankheit pro Tag) mit R, und bin ein wenig kämpfen mit der Formatierung der X-Achse .Formatieren Histogramm X-Achse bei der Arbeit mit Daten mit R

Ich bin mir bewusst, dass ggplot sehr schönes Graphen gibt und leicht manipulierbare Achsen (Understanding dates and plotting a histogram with ggplot2 in R), aber in diesem Fall ziehe ich den hist() Befehl verwenden, weil ich beschreibe 2 verschiedene Muster zur gleichen Zeit, wie weiter unten (I don ‚t denken Sie etwas ähnliches in ggplot tun können):

enter image description here

das Problem hierbei ist, dass die x-Achse nicht im ersten Fall beginnt, hat zu viele Teilstriche, und ich möchte in der Lage sein, einen systematischen Datumsmarker zu haben, z. alle 7 Tage oder jeden 1. des Monats.

Die Daten werden in einer Datenbank (dat.geo) als eine Zeile pro Verdacht, mit Informationen über Datum des Beginns und Vorort (ob schwarz oder weiß in Histogramm), wie im folgenden gespeichert:

> 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 

hier ist mein Code:

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() 

ich versucht habe, die Unterdrückung der Achse und das Hinzufügen einer manipulierten man später mit diesem Code

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

aber das ist, was ich (und ich habe keine Ahnung, wie das manipulieren):

enter image description here

Ihre Hilfe wird sehr geschätzt!

dank

+0

Verwenden Sie 'axis (1, at = x, labels = y)' wobei 'x' die Koordinaten der Ticks (numerischer Vektor) und' y' die Tick-Label (Zeichenvektor) sind. – Backlin

+0

Sie können 'position =" identity "' in 'ggplot' verwenden, um die Balken zu überlagern. – James

Antwort

16

Da Sie uns effektiv eine ggplot Lösung bereitzustellen, in Frage gestellt, hier ist es:

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")) 

Beachten Sie die Verwendung von position="identity" jeden Takt zu zwingen, auf der Achse stammen, sonst hat man eine bekommen gestapeltes Diagramm standardmäßig.

enter image description here

+0

Danke für Ihre Bemühungen - das sieht gut aus, aber ich bevorzuge die ursprüngliche Lösung für dieses spezielle Problem, weil Sie die beiden Kurven sehen können Gesamtheit. Ich werde mich an diese Technik für den zukünftigen Gebrauch erinnern, obwohl –

+0

@jpolonsky Können Sie bitte erklären, was Sie meinen, indem Sie * in der Lage sind, die zwei Kurven in ihrer Gesamtheit * zu sehen? Schlagen Sie vor, die Stäbe zu stapeln? Oder den Bars auszuweichen? Oder etwas anderes? Jede dieser Optionen ist auch in 'ggplot' möglich. – Andrie

+1

Ich entschuldige mich, ich habe gerade gesehen, dass durch das Hinzufügen von Alpha = 0,5 zum Befehl stat_bin, können Sie Folien bekommen, was wirklich das war, wonach ich suchte. Danke für diese hervorragende Lösung! –

8

Es gibt zwei Lösungen zur Verfügung; 1 unter Verwendung hist() und die andere unter Verwendung von 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) 

Diese Epidemie Kurve wie unten ist:

enter image description here

unter Verwendung einer Lösung ggplot, vorgeschlagen von Andrie oben wird, wie folgt:

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")) 

, die wie unten eine Epidemie Kurve gibt:

enter image description here

Verwandte Themen