2017-05-04 3 views
1

Ich versuche, Box-und Whisker-Plots mit einigen Prognosedaten zu tun. Und möchten Beobachtungen als eine Linie zur Handlung hinzufügen. Ich produziere hier ein Beispiel der Daten, damit Sie verstehen können, wie es aussieht.So fügen Sie eine Zeile zu einem Boxplot mit ggplot2 hinzu

$forecasts<- data.frame(f_type=c(rep("A",9),rep("B",9)),Date=c(rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3),rep(as.Date("2007-01-31"),3),rep(as.Date("2007-02-28"),3),rep(as.Date("2007-03-31"),3)),value=c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27))

$observation<- data.frame(Dt=c(as.Date("2007-01-31"),as.Date("2007-02-28"),as.Date("2007-03-31")),obs=c(30,49,57))

die Prognose mit mir die Box und Whisker-Plot mit ggplot2 wie unten dargestellt werden kann,.

$p<- ggplot(data = forecasts, aes(x=as.factor(Date), y=value)) p<- p + geom_boxplot(aes(fill=f_type))

Jetzt möchte ich diese Handlung die Beobachtungen für diese Daten als Linie hinzuzufügen. Bisher habe ich folgendes versucht:

  1. $p<- p + geom_line(data = observation,aes(x=Dt,y=obs)). Dies gibt eine Fehlermeldung,:

    Error: Invalid input: date_trans works with objects of class Date only

  2. mit x-Achse als Faktor wie folgt aus: $p<- p + geom_line(data = observation,aes(x=as.factor(Dt),y=obs)) für die bekomme ich folgende Fehlermeldung:

    geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?

Kann jemand bitte vorschlagen, wie ich kann, dies erreichen? Danke im Voraus.

Antwort

1

versuchen Sie dies:

p<- ggplot(data = forecasts, aes(x=as.factor(Date), y=value)) 
p<- p + geom_boxplot(aes(fill=f_type)) 

p <- p + geom_hline(aes(yintercept=12), colour="#990000") 
p 

Hier ist ein Link: http://www.cookbook-r.com/Graphs/Lines_(ggplot2)/

+0

Ich versuche nicht, eine horizontale Linie hinzuzufügen. Ich möchte eine Zeile hinzufügen, die die Beobachtungen darstellt, die ich habe. –

1
forecasts<- data.frame(f_type = c(rep("A",9), rep("B",9)), Date = c(rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3), rep(as.Date("2007-01-31"),3), rep(as.Date("2007-02-28"),3), rep(as.Date("2007-03-31"),3)), value = c(10,50,60,05,90,20,30,46,39,69,82,48,65,99,75,15,49,27)) 

observation<- data.frame(Dt = c(as.Date("2007-01-31"), as.Date("2007-02-28"), as.Date("2007-03-31")), obs = c(30,49,57)) 
p <- ggplot(data = forecasts, aes(x = as.factor(Date), y = value)) 
p <- p + geom_boxplot(aes(fill = f_type)) 
p <- p + geom_line(data = observation,aes(x = as.factor(Dt), y = obs, group = 1)) 
print(p) 

boxplot with line

+0

Danke. Es scheint, dass die Verwendung von Gruppenargument mit geom_line das Problem löst. –

0
ggplot() + 
    geom_boxplot(data = forecasts, 
       aes(x = Date, y = value, 
        group = interaction(Date, f_type), 
        fill = f_type), 
       width = 10) + 
    geom_line(data = observations, 
      aes(x = Dt, y = obs), size = 2) 

Dies ist, was Sie wollen. Sie benötigen die x als fortlaufende Datumsvariable (nicht as.factor wie in Ihrem Code). Auf diese Weise ist der Typ der Daten, die für die x-Achse erwartet werden, in beiden Datensätzen gleich. Sie müssen die Zeile group = hinzufügen, damit sie für jedes Datum und jeden f_type eine separate Box erstellen kann. Dann ist das Hinzufügen der Zeile einfach.

enter image description here

Wenn Sie nichtx wollen ein kontinuierliches Datum sein, dann die Nutzung von as.factor ist richtig, aber dann müssen Sie ein group zum geom_line hinzuzufügen, so weiß er, wie Punkte zu verbinden über diskrete Faktoren.

ggplot() + 
    geom_boxplot(data = forecasts, 
       aes(x = as.factor(Date), y = value, 
        group = interaction(Date, f_type), 
        fill = f_type)) + 
    geom_line(data = observations, 
      aes(x = as.factor(Dt), y = obs, group = 1), size = 2) 

enter image description here

Beachten Sie auch, dass ich die width Option im zweiten Graphen entfernt (was bedeutet, dass ich den Standard-ggplot Wert nur verwenden). Sie können mit diesem Wert herumspielen, um zu sehen, was mit Ihren Daten am besten aussieht.

Schließlich, in meinen beiden Beispielen, bewegte ich die Daten und Ästhetik in die geom Aussagen, die sie verwenden würden.In komplexen Zahlen ist es manchmal schwierig, sich zu merken, welche Schichten welche Daten und welche Ästhetik verwenden. Während des Debuggens und der Fehlersuche ist es also angenehm, im Haupt-ggplot() keinen Anruf zu haben.

+0

Perfekt. Ich habe nach etwas wie deiner zweiten Methode gesucht. Danke vielmals. –

+0

Gibt es eine Möglichkeit, die Whiskers zu dieser Parzelle zu definieren? Ich habe stat_summary mit definierten Funktionen und geom = "boxplot" probiert. Dies nimmt zwar die angegebenen Bereichsdefinitionen in Anspruch, vermasselt aber die Gruppen. –

+0

Definieren wie? Laut der Dokumentation, http://ggplot2.tidyverse.org/reference/geom_boxplot.html, reichen die Whisker bis zum 1,5-fachen des Interquartilsbereichs, aber das kann mit 'coef =' in 'geom_boxplot' angepasst werden. Wenn Sie wollen, dass die Whisker eine andere Statistik sind, benötigen Sie eine Funktion, die Sie wie gewohnt an "stat_summary" übergeben, aber Sie müssen die "aes (...)" von oben einfügen, um die Gruppierung korrekt zu halten. – Brian

Verwandte Themen