Ich möchte ein Balkendiagramm erstellen, in dem die Antwortvariable (Gewichtsänderung) über unterschiedlich lange Zeiträume gemessen wird, definiert durch ein Start- und ein Enddatum. Die Breite der Balken sollte der Länge des Zeitraums entsprechen. Ein kleines Beispiel meiner Daten:Balkendiagramm mit variablen Balkenbreiten als Datumsbereiche auf der X-Achse
wtchange.data <- structure(list(start.date = structure(1:3, .Label = c("2015-04-01",
"2015-04-15", "2015-04-30"), class = "factor"), end.date = structure(1:3, .Label = c("2015-04-15",
"2015-04-30", "2015-05-30"), class = "factor"), wtchange = c(5L,
10L, 15L), se = c(1.2, 2.5, 0.8)), .Names = c("start.date", "end.date",
"wtchange", "se"), class = "data.frame", row.names = c(NA, -3L
))
wtchange.data
# start.date end.date wtchange se
# 1 2015-04-01 2015-04-15 5 1.2
# 2 2015-04-15 2015-04-30 10 2.5
# 3 2015-04-30 2015-05-30 15 0.8
wtchange.data$start.date <- as.Date(wtchange.data$start.date)
wtchange.data$end.date <- as.Date(wtchange.data$end.date)
Versuch geom_bar
zu verwenden:
library(ggplot2)
ggplot(wtchange.data, aes(x = start.date, y = wtchange)) +
geom_bar(stat = "identity", color = "black") +
geom_errorbar(aes(ymin = wtchange-se, ymax = wtchange+se), width = 1)
(nicht erlaubt> 2 Links mit < 10 Ruf, so kann leider nicht die erste Handlung zeigen)
Das Hauptproblem ist, dass wenn die Ästhetik des Diagrammbereichs definiert ist (x = start.date, y = wtchange
), kann ich nur eine Variable (start.date in diesem Beispiel) für die x-Achse verwenden, aber ich brauche wirklich um sowohl start.date als auch end.date irgendwie zu verwenden, um Strichbreiten zu begrenzen, die jeder Periode entsprechen. Das Diagramm sollte wie folgt aussehen (in der Farbe gezeichnet):
Ein zweites Problem besteht darin, dass die Stäbe lückenlos berühren sollten, aber ich bin nicht sicher, ob es überhaupt möglich ist, da die Stäbe sein müssen verschiedene Breiten, so dass Sie keine Balkenbreite für alle Balken festlegen können. Wäre es möglich, die Breite für jeden Balken manuell festzulegen?
Edit: Danke Henrik für die Links. Ich habe einige Fortschritte gemacht. I berechnete Datum Mittelpunkte für die Zentrierung der Stäbe an:
wtchange.data$date.midpoint <- wtchange.data$start.date +
(wtchange.data$end.date - wtchange.data$start.date)/2
Und dann berechnet Periodenlängen für die Verwendung als Strichbreiten:
wtchange.data$period.length <- wtchange.data$end.date - wtchange.data$start.date
Die aktualisierte Graph-Code ist jetzt:
ggplot(wtchange.data, aes(x = date.midpoint, y = wtchange)) +
geom_bar(stat = "identity", color = "black", width = wtchange.data$period.length) +
geom_errorbar(aes(ymin = wtchange-se, ymax = wtchange+se), width = 1)
Das einzige verbleibende Problem i s, dass es immer noch eine kleine Lücke zwischen den Bars an einem Ort gibt. Ich schätze, das liegt an der Art und Weise, wie R die Datumsdifferenzberechnung auf die nächste Anzahl von Tagen rundet.