So setzen Sie die Legende Alpha mit ggplot2

81

Ich habe ein Diagramm der Windgeschwindigkeiten gegen die Richtung, das eine große Anzahl von Punkten hat, und verwende daher zusätzlich zu Farbe = Monat Alpha = I (1/20)

Hier ist ein Codebeispiel:

library(RMySQL)
library(ggplot2)
con <- dbConnect(...)
wind <- dbGetQuery(con, "SELECT speed_w/speed_e AS ratio, dir_58 as dir, MONTHNAME(timestamp) AS month, ROUND((speed_w+speed_e)/2) AS speed FROM tablename;");

png("ratio-by-speed.png",height=400,width=1200)
qplot(wind$dir,wind$ratio,ylim=c(0.5,1.5),xlim=c(0,360),color=wind$month,alpha=I(1/30),main="West/East against direction")
dev.off()

Dies führt zu einem anständigen Diagramm. Mein Problem ist jedoch, dass das Alpha der Legende ebenfalls 1/30 beträgt, was es unlesbar macht. Gibt es eine Möglichkeit, die Legende auf 1 Alpha zu zwingen?

Hier ist ein Beispiel: Beispieldiagramm

Chris
quelle

Antworten:

112

Update Mit der Veröffentlichung von Version 0.9.0 können jetzt ästhetische Werte in der Legende mithilfe override.aesder guidesFunktion überschrieben werden. Wenn Sie also Ihrer Handlung so etwas hinzufügen:

+ guides(colour = guide_legend(override.aes = list(alpha = 1)))

das sollte es tun.


Ich habe dies umgangen, indem ich das Geom mit einer leeren Teilmenge der Daten und der Legende aus diesem Aufruf doppelt aufgerufen habe. Leider funktioniert es nicht, wenn der subset(diamonds,FALSE)Datenrahmen tatsächlich leer ist (z. B. wie Sie ihn erhalten würden ), da ggplot2 diesen Fall anscheinend genauso behandelt, wie er NULLanstelle eines Datenrahmens behandelt wird. Wir können den gleichen Effekt erzielen, indem wir eine Teilmenge mit nur einer Zeile NaNauf eine der Plotdimensionen setzen, um zu verhindern, dass sie geplottet wird.

Basierend auf Chases Beispiel:

# Alpha parameter washes out legend:
gp <- ggplot() + geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1)
print(gp)

# Full color legend:
dummyData <- diamonds[1, ]
dummyData$price <- NaN
#dummyData <- subset(diamonds, FALSE)   # this would be nicer but it doesn't work!
gp <- ggplot() +
  geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1, legend=FALSE) + 
  geom_point(data=dummyData, aes(depth, price, colour=clarity), alpha=1.0, na.rm=TRUE)
print(gp)
yoyoyoyosef
quelle
1
Brillant. Diese Lösung war unglaublich. Ich bin gerade erst dazu gekommen, es auszuprobieren. Arbeitet ein Vergnügen
Chris
3
+1 für @ jorans Update (und ein großartiger Hack, der jetzt unnötig ist)
Gregor Thomas
Ich verwende Version 0.9.3.1, aber es funktioniert nicht für mich. Ich habe die guides()Funktion in verschiedene Positionen gebracht, aber ich bekomme nicht das erwartete Verhalten. Irgendwelche Hinweise?
polarisieren
Um einen alten Thread hinzuzufügen, müssen Sie Änderungen colourvornehmen , je nachdem, was Sie zum Festlegen der Farben verwenden. Zum Beispiel habe ich die obige Lösung mit verwendet, guides(fill = guide_legend(...))da ich sie aes(fill = val)für meinen Plot verwendet habe
Mxblsdl
4

Ein bisschen googeln ist in diesem Beitrag aufgetaucht, was nicht darauf hindeutet, dass ggplot diese Option derzeit unterstützt. Andere haben verwandte Probleme mithilfe von gridExtra und viewPorts behoben, wie hier erläutert .

Ich bin nicht so raffiniert, aber hier ist ein Ansatz, der Ihnen die gewünschten Ergebnisse liefern sollte. Der Ansatz besteht darin, das Geom zweimal zu zeichnen, einmal ohne Alpha-Parameter und außerhalb des realen Plotbereichs. Das zweite Geom enthält den Alpha-Parameter und unterdrückt die Legende. Wir werden dann den Plotbereich mit xlim und ylim spezifizieren. Angesichts der Tatsache, dass Sie viele Punkte haben, wird dies die Plotzeit ungefähr verdoppeln, sollte Ihnen jedoch den gewünschten Effekt verleihen.

Verwenden des Diamanten-Datensatzes:

#Alpha parameter washes out legend
ggplot(data = diamonds, aes(depth, price, colour = clarity)) + 
geom_point(alpha = 1/10)

#Fully colored legend
ggplot() +
geom_point(data = diamonds, aes(depth, price, colour =clarity), alpha = 1/10, legend = FALSE) + 
geom_point(data = diamonds, aes(x = depth - 999999, y = price - 999999, colour = clarity)) +
xlim(40, 80) + ylim(0, 20000) 
Verfolgungsjagd
quelle