2017-01-10 5 views
0

Ich habe erheblich gesucht, was ich erreichen will, aber ich habe nicht über Beispiele oder Diagramme, die genau das sind, was ich suche), also strecke ich die Gemeinschaft aus.ggplot2: Zeitreihendiagramm durch kontinuierliche Variable, Farbe/füllen nach Gruppe

Was ich habe (Daten zum Download here):

Zeitreihendaten (jeder Datensatz 2 Stunden auseinander und Spanning fast ein Jahr) mit zugehörigem Erhebung und Eigentums.

library(ggplot2) 
data <- read.csv("dataex.csv") 
data$timestamp <-as.POSIXct(as.character(data$timestamp),format="%m/%d/%Y %H:%M", tz="GMT") 

Was ich will (via ggplot):

eine Linie oder Balkendiagramm angehoben zeigt (y-Achse) über die Zeit (x-Achse) für jeden Datensatz Daten durch Eigentums gefärbt (für eine Liniendiagramm, Füllen der Fläche unter der Linie oder für ein Balkendiagramm, Füllen der Leiste). Ich habe Wiederholungen von geom_line, geom_bar und geom_area (w geom_bar unterhalb der nächsten, die ich gekommen bin) versucht. Ich möchte, dass mindestens eine der folgenden Optionen wahr wird!

Option A - Die nächstgelegene ich gekommen bin, dies zu erreichen (pro Datensatz Plotten) ist mit dem folgenden Code:

ggplot(data, aes(x=timestamp, y=elev, fill=OWNER)) + geom_bar(stat="identity") 

Allerdings würde ich die Stäbe wie sie einander berühren, aber wenn ich die width in geom_bar() einstellen, verschwindet alles. (Wenn ich den obigen Code auch für andere Stapel ähnlicher Daten verwende, wird nur ein Bruchteil der Balken angezeigt, wahrscheinlich weil sie mehr Datensätze haben). Scheint, als ob es einfach zu viele Daten zum Plotten sind. Also habe ich versucht, einen anderen Weg ...

Option B - Plotten von Tag, die informativer erweist, jeden Tag die Variabilität in Besitz zeigt.

ggplot(data, aes(x=as.Date(Date, format='%Y-%m-%d'), y=elev, fill=OWNER)) + geom_bar(stat="identity", width=1) 

Dies summiert jedoch die y-Achse, so dass die Höhe nicht interpretierbar ist. Ich könnte die y-Achse durch 12 teilen (die typische Anzahl von Aufzeichnungen pro Tag), aber es gibt gelegentliche Tage mit weniger als 12 Aufzeichnungen, die die y-Achse verursacht, die falsch ist. Gibt es eine Funktion oder eine Möglichkeit, die y-Achse durch die entsprechende Anzahl von Datensätzen pro Tag zu teilen, die in der Darstellung dargestellt werden? Oder hat jemand Rat für eine bessere Lösung?

Antwort

0

Etwas wie:

library(readr) 
library(dplyr) 
library(ggplot2) 
library(ggalt) 

readr::read_csv("~/Desktop/dataex.csv") %>% 
    mutate(timestamp=lubridate::mdy_hm(timestamp)) %>% 
    select(timestamp, elev, Owner=OWNER) -> df 

ggplot(df, aes(timestamp, elev, group=Owner, color=Owner)) + 
    geom_segment(aes(xend=timestamp, yend=0), size=0.1) + 
    scale_x_datetime(expand=c(0,0), date_breaks="2 months") + 
    scale_y_continuous(expand=c(0,0), limits=c(0,2250), label=scales::comma) + 
    ggthemes::scale_color_tableau() + 
    hrbrmisc::theme_hrbrmstr(grid="Y") + 
    labs(x=NULL, y="Elevation") + 
    theme(legend.position="bottom") + 
    theme(axis.title.y=element_text(angle=0, margin=margin(r=-20))) 

enter image description here

?

+0

Ausgezeichnet! Das ist eine sehr schöne Lösung für Option A. Vielen Dank. – jdev

Verwandte Themen