Cómo configurar la leyenda alfa con ggplot2

81

Tengo un gráfico de velocidades del viento contra la dirección que tiene una gran cantidad de puntos, por lo que estoy usando alpha = I (1/20) además de color = month

Aquí hay una muestra de código:

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()

Esto produce un gráfico decente, sin embargo, mi problema es que el alfa de la leyenda también es 1/30, lo que lo hace ilegible. ¿Hay alguna manera de forzar que la leyenda sea 1 alfa?

Aquí hay un ejemplo: Gráfico de ejemplo

Chris
fuente

Respuestas:

110

Actualización Con el lanzamiento de la versión 0.9.0, ahora se pueden anular los valores estéticos en la leyenda usando override.aesen la guidesfunción. Entonces, si agrega algo como esto a su trama:

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

Deberias hacer eso.


He solucionado esto haciendo una llamada duplicada al geom usando un subconjunto vacío de los datos y usando la leyenda de esa llamada. Desafortunadamente, no funciona si el marco de datos está realmente vacío (por ejemplo, como lo obtendría subset(diamonds,FALSE)) ya que ggplot2 parece tratar este caso de la misma manera que trata NULLen lugar de un marco de datos. Pero podemos obtener el mismo efecto tomando un subconjunto con solo una fila y configurándolo NaNen una de las dimensiones de la parcela, lo que evitará que se grafique.

Basado en el ejemplo de Chase:

# 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
fuente
1
Brillante. Esta solución fue asombrosa. Acabo de empezar a probarlo. Funciona de maravilla
Chris
3
+1 para la actualización de @ joran (y un gran truco que ahora es innecesario)
Gregor Thomas
Estoy usando la versión 0.9.3.1 pero no me funciona. He puesto la guides()función en varias posiciones pero no obtengo el comportamiento esperado. ¿Alguna pista?
polarizar
Para agregar a un hilo antiguo, debe cambiar coloursegún lo que esté usando para configurar los colores. Por ejemplo, usé la solución anterior con guides(fill = guide_legend(...))ya que usé aes(fill = val)para mi trama
Mxblsdl
4

Un poco de búsqueda en Google apareció en esta publicación, lo que no parece indicar que ggplot actualmente admita esta opción. Otros han abordado problemas relacionados utilizando gridExtra y viewPorts como se explica aquí .

No soy tan sofisticado, pero aquí hay un enfoque que debería brindarle los resultados deseados. El enfoque es trazar la geom dos veces, una vez sin un parámetro alfa y fuera del área de trazado real. La segunda geom incluirá el parámetro alfa y suprimirá la leyenda. Luego especificaremos la región de trazado con xlim e ylim. Dado que tiene muchos puntos, esto duplicará aproximadamente el tiempo de trazado, pero debería darle el efecto que busca.

Usando el conjunto de datos de diamantes:

#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) 
Persecución
fuente