Comment définir la légende alpha avec ggplot2

J’ai un graphique des vitesses du vent par rapport à la direction qui comporte un grand nombre de points, et j’utilise donc alpha = I (1/20) en plus de la couleur = mois

Voici un exemple de code:

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

Cela produit un graphique décent, mais mon problème est que l’alpha de la légende est également 1/30, ce qui le rend illisible. Y a-t-il un moyen de forcer la légende à être 1 alpha à la place?

Voici un exemple: Exemple de graphique

Mise à jour Avec la version 0.9.0, il est désormais possible de remplacer les valeurs esthétiques de la légende en utilisant override.aes dans la fonction guides . Donc, si vous ajoutez quelque chose comme ça à votre plot:

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

ça devrait le faire.


J’ai contourné cela en faisant un appel en double au geom en utilisant un sous-ensemble vide des données et en utilisant la légende de cet appel. Malheureusement, cela ne fonctionne pas si le bloc de données est réellement vide (comme dans le subset(diamonds,FALSE) ) car ggplot2 semble traiter ce cas comme s’il traitait NULL à la place d’un bloc de données. Mais nous pouvons obtenir le même effet en prenant un sous-ensemble avec une seule ligne et en le définissant sur l’une des dimensions du tracé, ce qui l’empêchera de tracer.

Basé sur l’exemple 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) 

Un peu de googler a mis en ligne ce post qui ne semble pas indiquer que ggplot supporte actuellement cette option. D’autres ont abordé des problèmes liés en utilisant gridExtra et en utilisant viewPorts comme discuté ici .

Je ne suis pas si sophistiqué, mais voici une approche qui devrait vous donner les résultats souhaités. L’approche consiste à tracer le géom à deux resockets, une fois sans paramètre alpha et en dehors de la zone de traçage réelle. Le second geom inclura le paramètre alpha et supprimera la légende. Nous spécifierons ensuite la région de tracé avec xlim et ylim. Étant donné que vous avez beaucoup de points, cela doublera à peu près le temps de traçage, mais devrait vous donner l’effet que vous recherchez.

Utilisation du jeu de données diamants:

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