2014-11-04 8 views
8

Ich versuche, ein Dual-Y-Achsen-Diagramm mit ggplot zu erstellen. Zunächst möchte ich sagen, dass ich nicht nach einer Diskussion über die Begründetheit der Frage suche, ob dies eine gute Praxis ist oder nicht. Ich finde, dass sie besonders nützlich sind, wenn man zeitbasierte Daten betrachtet, um Trends in zwei diskreten Variablen zu identifizieren. Eine weitere Diskussion hierzu ist meines Erachtens besser geeignet für eine Kreuzvalidierung.Wie zeige ich eine Legende auf Dual-Y-Achse ggplot

Kohske bietet ein sehr gutes Beispiel dafür, wie ich es gemacht habe, was ich bis jetzt sehr gut genutzt habe. Ich stehe jedoch an meiner Grenze, um eine Legende für beide y-Achsen aufzunehmen. Ich habe auch ähnliche Fragen here und here gesehen, aber keine scheint das Problem der Einfügung einer Legende anzusprechen.

Ich habe ein reproduzierbares Beispiel mit dem Diamanten-Datensatz von ggplot.

Daten

library(ggplot2) 
library(gtable) 
library(grid) 
library(data.table) 
library(scales) 

grid.newpage() 

dt.diamonds <- as.data.table(diamonds) 

d1 <- dt.diamonds[,list(revenue = sum(price), 
         stones = length(price)), 
        by=clarity] 

setkey(d1, clarity) 

Charts

p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill="#4B92DB")) + 
    geom_bar(stat="identity") + 
    labs(x="clarity", y="revenue") + 
    scale_fill_identity(name="", guide="legend", labels=c("Revenue")) + 
    scale_y_continuous(labels=dollar, expand=c(0,0)) + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1), 
     axis.text.y = element_text(colour="#4B92DB"), 
     legend.position="bottom") 

p2 <- ggplot(d1, aes(x=clarity, y=stones, colour="red")) + 
    geom_point(size=6) + 
    labs(x="", y="number of stones") + expand_limits(y=0) + 
    scale_y_continuous(labels=comma, expand=c(0,0)) + 
    scale_colour_manual(name = '',values =c("red","green"), labels = c("Number of Stones"))+ 
    theme(axis.text.y = element_text(colour = "red")) + 
    theme(panel.background = element_rect(fill = NA), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.border = element_rect(fill=NA,colour="grey50"), 
     legend.position="bottom") 

# extract gtable 
g1 <- ggplot_gtable(ggplot_build(p1)) 
g2 <- ggplot_gtable(ggplot_build(p2)) 


pp <- c(subset(g1$layout, name == "panel", se = t:r)) 
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, 
        pp$l, pp$b, pp$l) 
# axis tweaks 
ia <- which(g2$layout$name == "axis-l") 
ga <- g2$grobs[[ia]] 
ax <- ga$children[[2]] 
ax$widths <- rev(ax$widths) 
ax$grobs <- rev(ax$grobs) 
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") 
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 
# draw it 
grid.draw(g) 

FRAGE: Hat jemand ein paar Tipps haben, wie der 2. Teil der Legende bekommen zu zeigen?

Die folgenden Diagramme werden in der Reihenfolge p1, p2, kombiniert p1 & p2 erstellt. Sie werden feststellen, dass die Legende für p2 nicht im kombinierten Diagramm angezeigt wird.

p1

p1

p2

p2

& p1 p2 kombiniert

combined p1 & p2

Antwort

6

Ähnlich wie bei der oben beschriebenen Technik können Sie die Legenden extrahieren, sie binden und dann die Plot-Legende mit ihnen überschreiben.

beginnend Also von # draw it in Ihrem Code

# extract legend 
leg1 <- g1$grobs[[which(g1$layout$name == "guide-box")]] 
leg2 <- g2$grobs[[which(g2$layout$name == "guide-box")]] 

g$grobs[[which(g$layout$name == "guide-box")]] <- 
            gtable:::cbind_gtable(leg1, leg2, "first") 
grid.draw(g) 

enter image description here

+0

, dass ein absoluter Genuss funktioniert. Wenn ich es für die Aufnahme in eine Funktion wie meine Frage [hier] (http://stackoverflow.com/questions/26728852/create-function-to-ggplot-with-data-table) erweitern wollte, wie erzwinge ich die Legende mit meiner Farbpalette außerhalb von 'aes'? oder alternativ in der Lage sein, eine einzelne Farbe oder data.table-Spalte an 'aes_string' zu übergeben, um die Füllung zu setzen? – Dan

+0

Ich habe eine Hack-Lösung für jetzt gefunden. Da der 'aes_string' Zeichenfolgen zu verwenden scheint und sie in Variablennamen konvertiert, habe ich mein Rot zu '" \ "red \" "geflüchtet und es scheint gut zu funktionieren. – Dan

+0

Sie scheinen ziemlich vertraut mit Grob zu sein, ich frage mich, wie dies erweitert werden könnte, um auch Facetten zu berücksichtigen? Soll ich das als neue Frage stellen? – Dan

Verwandte Themen