2016-04-19 6 views
0

Ich habe eine Funktion erstellt, die ggvis verwendet, um einige der Daten, die wir regelmäßig überprüfen, grafisch darzustellen. In diesem Fall wird die letzte Gruppe "Overall" überschrieben, um sie als schwarze Linie mit einer Breite von 3 anstelle des Standards anzuzeigen. Leider werden die Schritte, die ich unternommen habe, um den Standard zu überschreiben, nicht in der Legende angezeigt. Ich bin mir nicht sicher, was ich tun soll, damit das funktioniert. Ich habe versucht, die add_legend spezifisch aufzurufen, aber das hat nicht funktioniert.Wie kann ich die ggvis-Legende mit der Grafik vergleichen?

S.O. Line Graph

Der verwendete Code ist dies (auch mit einigen Zufallsdaten) zu erzeugen:

CAL_DATE = seq(as.Date("10/1/2015", format = "%m/%d/%Y"), 
       as.Date("3/31/2016", format = "%m/%d/%Y"), by = 1) 
CAL_DATE = as.POSIXct(CAL_DATE) 
a = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
             5, 500),0), CT_DS = rep("A",length(CAL_DATE)))) 
b = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
             4, 540),0), CT_DS = rep("B", length(CAL_DATE)))) 
Overall = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
              10, 475),0), CT_DS = rep("Overall", length(CAL_DATE)))) 
a$CAL_DATE = CAL_DATE 
b$CAL_DATE = CAL_DATE 
Overall$CAL_DATE = CAL_DATE 

data = rbind(a, b, Overall) 

plot_ma = function(x){ 
     x %>% 
       group_by(CT_DS) %>% 
       ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>% 
       layer_lines() %>% 
       filter(CT_DS == "Overall") %>% 
       layer_lines(stroke := "black", strokeWidth := 3) %>% 
       set_options(renderer = "canvas") %>% 
       add_legend("stroke", title = "~ CT") %>% 
       add_axis("x", title = "Date", title_offset = 60, 
         properties = axis_props(
           labels = list(
             angle = -50, 
             align = "right", 
             baseline = "middle" 
           ))) %>% 
       add_axis("y", title = "M.A. AHT (sec)") 
} 
plot_ma(data) 

, die wie unten etwas erzeugen sollen. Meine einzige Sorge ist, wie die Legende "Overall" auch als Schwarz erscheinen lässt.

enter image description here

+0

Können Sie einen kleinen Beispiel-Datensatz hinzufügen? – aosmith

+1

Wenn 'Overall' immer zuletzt ist, denke ich, dass Sie einfach die Farben in' scale_nominal' über 'range' definieren können. In Ihrem einfachen Beispiel wäre es etwas wie "scale_nominal (" stroke ", range = c (" blau "," orange "," schwarz ")).Für weitere Gruppen können Sie einen Vektor mit Farben erstellen oder Farben aus einem Muster für die Anzahl der Gruppen ziehen, die Sie haben, und dann "schwarz" an das Ende anhängen. – aosmith

+0

Die Anzahl der Gruppen kann zwischen den Datensätzen stark variieren. Könnten Sie mir mehr Einblick geben, wie man Farben aus der Probe zieht? Ich schaute in ein ggvis-Objekt, um herauszufinden, wo es sein könnte, hatte aber keinen Erfolg. –

Antwort

1

Mit scale_nominal und die Bereitstellung der range können Sie die Farben einstellen sowohl in der Grafik und der Legende.

In Ihrem einfachen Beispiel ist dies so einfach wie das Hinzufügen von z. B. scale_nominal("stroke", range = c("blue", "orange", "black")) an das Ende Ihres Plotting-Codes.

Es klingt wie die Anzahl der Gruppen variieren kann. Von der Gruppe Overall ist immer die letzte in der Reihenfolge (oder Sie legen sie als letzte über factor fest), Sie können etwas ähnliches wie oben verwenden und es Teil Ihrer Funktion machen. In diesem Fall sollten Sie eine Farbpalette einrichten, die Ihnen gefällt (und die kein Schwarz enthält), die genug Farben für alle Ihre Gruppen hat.

Hier nehme ich eine der Paletten unter Cookbook for R mit 8 verschiedenen Farben.

cbPalette = c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7") 

Wir können die Anzahl der benötigten Farben aus der Palette für einen bestimmten Datensatz herausziehen, indem wir die Anzahl der Ebenen des Gruppierungsfaktors verwenden. Die Anzahl der benötigten Farben ist minus 1, da die letzte immer schwarz ist.

Hier ist eine Möglichkeit, die Anzahl der Gruppen berechnen müssen Farbe minus 1.

ncol = nlevels(data[["CT_DS"]]) - 1 

Diese Information kann verwendet werden, um die ersten 1 bis „Anzahl der Ebenen minus 1“ ziehen Farben aus cbPalette.

pal = cbPalette[1:ncol] 

Dies kann für das range Argument von scale_nominal verwendet werden, "black" auf das Ende des Vektors anhängt.

scale_nominal("stroke", range = c(pal, "black"))

Dieser Prozess um Ihre Funktion leicht hinzugefügt wird.

plot_ma = function(x){ 
    ncol = nlevels(x[["CT_DS"]]) - 1 
    pal = cbPalette[1:ncol] 
    x %>% 
     group_by(CT_DS) %>% 
     ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>% 
     layer_lines() %>% 
     filter(CT_DS == "Overall") %>% 
     layer_lines(stroke := "black", strokeWidth := 3) %>% 
     set_options(renderer = "canvas") %>% 
     add_legend("stroke", title = "~ CT") %>% 
     add_axis("x", title = "Date", title_offset = 60, 
       properties = axis_props(
        labels = list(
         angle = -50, 
         align = "right", 
         baseline = "middle" 
        ))) %>% 
     add_axis("y", title = "M.A. AHT (sec)") %>% 
     scale_nominal("stroke", range = c(pal, "black")) 
} 
plot_ma(data) 

enter image description here

+0

Es funktioniert genau so, wie Sie @aosmith beschrieben haben. Vielen Dank. –

Verwandte Themen