2011-03-13 26 views
56

Tengo un gráfico de las velocidades del viento en contra dirección que tiene un enorme Numeber de puntos, por lo que estoy usando alfa = I (1/20), además de color = mesCómo establecer la leyenda alfa con ggplot2

Aquí es 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 una gráfica decente, sin embargo, mi problema es que el alfa de la leyenda es 1/30o también, lo que hace que sea ilegible. ¿Hay alguna manera de forzar a la leyenda a ser 1 alfa en su lugar?

Aquí se muestra un ejemplo: Example Graph

+0

parcela magnífico, BTW. –

Respuesta

73

actualización Con el lanzamiento de la versión 0.9.0, ahora uno puede anular los valores estéticos en la leyenda usando override.aes en la función guides. Entonces, si agrega algo como esto a su trama:

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

que debería hacerlo.


que he recibido alrededor de esto haciendo una llamada duplicado a la geom usando un subconjunto vacío de los datos y el uso de la leyenda de esa llamada. Lamentablemente, no funciona si el marco de datos está realmente vacío (por ejemplo, como obtendría del subset(diamonds,FALSE)), ya que ggplot2 parece tratar este caso de la misma manera que trata NULL en lugar de un marco de datos. Pero podemos obtener el mismo efecto si tomamos un subconjunto con una sola fila y lo configuramos en NaN en una de las dimensiones de la gráfica, lo que evitará que se dibuje.

Basado de 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) 
+0

Brillante. Esta solución fue increíble. Solo acabo de probarlo. Funciona como un regalo – Chris

+2

+1 para la actualización de @ joran (y un gran truco que ahora no es necesario) – Gregor

+0

Estoy usando la versión 0.9.3.1 pero no funciona para mí. Puse la función 'guides()' en varias posiciones pero no obtuve el comportamiento esperado. ¿Algún consejo? – polarise

5

Un poco de google aparecido this post que no parece indicar que ggplot actualmente soporta esta opción. Otros han abordado los problemas relacionados usando gridExtra y usando viewPorts como se describe en here.

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

Utilizando el conjunto de datos 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) 
Cuestiones relacionadas