2016-01-08 11 views
6

ich, indem Sie mein Beispiel-Code zu starten:Edit 2 stat_hex_bin GEOMS separat ggplot2

x <- runif(1000,0, 5) 
y <- c(runif(500, 0, 2), runif(500, 3,5)) 
A <- data.frame("X"=x,"Y"=y[1:500]) 
B <- data.frame("X"=x,"Y"=y[501:1000]) 
ggplot() + 
    stat_bin_hex(data=A, aes(x=X, y=Y), bins=10) + 
    stat_bin_hex(data=B, aes(x=X, y=Y), bins=10) + 
    scale_fill_continuous(low="red4", high="#ED1A3A") 

Es produziert die folgende Handlung: enter image description here

Jetzt möchte ich die unteren Hexagone eine andere Skala folgen. Nämlich von dunkelgrün bis hellgrün. Wie kann ich das erreichen?

Update: Wie Sie aus den Antworten sehen können, frage ich mich, ob es eine Lösung ohne Verwendung von Alpha-Skalen gibt. Auch die Verwendung von zwei Plots ohne Rand oder ähnliches ist für meine spezielle Anwendung keine Option. Obwohl beide legitime Antworten sind :)

+0

Sollte es nicht sein 'stat_binhex()'? –

+0

Nun, beide zeichnen genau das gleiche. Nicht sicher, ob es einen Unterschied neben dem Namen gibt. –

+1

'stat_bin_hex' funktionierte nicht für mich. Vielleicht habe ich veraltete Version von 'ggplot2' –

Antwort

4

Anstatt zu versuchen, zwei verschiedene fill Skalen in einem Plot bekommen Sie die Farben der unteren Werte verändern könnten, nachdem das Grundstück gebaut wurde. Der Grundgedanke ist, zwei Plots mit den unterschiedlichen Füllskalen zu haben und dann bestimmte Details von einem Plot zum anderen zu kopieren.

# Base plot 
p <- ggplot() + 
    stat_bin_hex(data=A, aes(x=X, y=Y), bins=10) + 
    stat_bin_hex(data=B, aes(x=X, y=Y), bins=10) 

# Produce two plots with different fill colours 
p1 <- p + scale_fill_continuous(low="red4", high="#ED1A3A") 
p2 <- p + scale_fill_continuous(low="darkgreen", high="lightgreen") 

# Get fill colours for second plot and overwrite the corresponding 
# values in the first plot 
g1 <- ggplot_build(p1) 
g2 <- ggplot_build(p2) 
g1$data[[1]][,"fill"] <- g2$data[[1]][,"fill"] 

# You can draw this now but there is only one legend 
grid.draw(ggplot_gtable(g1)) 

zwei Legenden haben Sie zusammen die Legenden aus den beiden Parzellen beitreten können

# Bind the legends from the two plots together 
g1 <- ggplot_gtable(g1) 
g2 <- ggplot_gtable(g2) 

g1$grobs[[grep("guide", g1$layout$name)]] <- 
    rbind(g1$grobs[[grep("guide", g1$layout$name)]], 
     g2$grobs[[grep("guide", g2$layout$name)]]) 

grid.newpage() 
grid.draw(g1) 

Giving (von set.seed(10) vorherigen Generation zu Daten)

enter image description here

+1

Jetzt ist das noch besser. Obwohl es nur ein wenig frustrierend ist, dass es nicht möglich ist, dies zu tun. Meistens machst du am Ende grobs. Gute Antwort, ich gebe die Frage noch ein paar Tage :) –

1

Eine Alternative, wenn Sie mehr Optionen zum Spielen mit den Farben wünschen, erstellen Sie einfach zwei Diagramme und entfernen Sie den gesamten Abstand zwischen den beiden Plots, wenn Sie mit grid.arrange() kombiniert.

p1 <- ggplot() + stat_bin_hex(data=B, aes(x=X, y=Y), bins=10) + 
    scale_fill_continuous(low="red4", high="#ED1A3A") + xlab("") + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(), plot.margin=unit(c(1,1,-0.5,1), "cm")) + scale_y_continuous(limits = c(2.5, 5.5)) 

p2 <- ggplot() + stat_bin_hex(data=A, aes(x=X, y=Y), bins=10) + scale_fill_continuous(low="darkgreen", high="green") + theme(plot.margin=unit(c(-0.5,1,1,1), "cm")) + scale_y_continuous(limits = c(-0.5, 2.5)) 

grid.arrange(p1,p2) 

enter image description here

+0

Funktioniert nicht für mich. Die Daten in meiner Anwendung sind untere obere Grenzen eines Konfidenzintervalls. Sie müssen also in der gleichen Grafik gezeichnet werden:/ –

2

Dies sollte mehr oder weniger das, was Sie

ggplot() + 
    stat_bin_hex(data=A, aes(x=X, y=Y, alpha=..count..), bins=10,fill="green") + 
    stat_bin_hex(data=B, aes(x=X, y=Y, alpha=..count..), bins=10,fill="red") 

enter image description here

Um zu vermeiden möchten, dass die grau mit könnte man aufgrund der alpha zugrunde lag die Handlung stört ein weiteres weißes Plot an der gleichen Stelle und verdunkeln die Farben ein wenig, wie von der TO in den Kommentaren

vorgeschlagen
#just the red to show the impact due to scale_alpha 
ggplot() +scale_alpha_continuous(range=c(0.5,1))+ stat_bin_hex(data=A, aes(x=X, y=Y), bins=10,fill="white",show.legend = TRUE) + 
+  stat_bin_hex(data=A, aes(x=X, y=Y, alpha=..count..), bins=10,fill="red",show.legend = TRUE) + 
+  stat_bin_hex(data=B, aes(x=X, y=Y, alpha=..count..), bins=10,fill="green", show.legend=TRUE)+guides(fill=FALSE, alpha=FALSE) 

enter image description here

+0

Ich entschuldige mich. Ich dachte, dass diese Lösung kommen würde. Ich habe schon damit herumgespielt. Aber das Problem für mich ist, dass die hellsten Sechsecke nicht genug sichtbar sind. Und wenn ich 'scale_alpha_continuous (Bereich = c (0.5,1)) 'die Sechsecke sind nicht genug distinguierbar genug (für meine Zwecke). Also habe ich mich gefragt, ob es eine "no alpha" -Lösung gibt;) –

+0

Keine Sorge. Ich merke nur, dass es ein anderes Problem gibt. Die Legenden sind etwas durcheinander. Aber da es nicht das ist, was du willst, überlasse ich es hier, um zu vermeiden, dass andere es versuchen. ;) – CAFEBABE

+0

eigentlich füge ich eine hässliche Hack-Lösung für diesen in einer Sekunde hinzu. – CAFEBABE

Verwandte Themen