web-dev-qa-db-fra.com

Comment définir la légende alpha avec ggplot2

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

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/30e, ce qui le rend illisible. Existe-t-il un moyen de forcer la légende à 1 alpha à la place?

Voici un exemple: Example Graph

77
Chris

pdate Avec la sortie de la version 0.9.0, on peut désormais remplacer les valeurs esthétiques dans la légende en utilisant override.aes Dans la fonction guides. Donc, si vous ajoutez quelque chose comme ça à votre intrigue:

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

ça devrait le faire.


J'ai contourné cela en faisant un double appel 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 (par exemple, comme vous le feriez avec subset(diamonds,FALSE)) car ggplot2 semble traiter ce cas de la même manière qu'il traite NULL en place d'une trame 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 NaN sur l'une des dimensions du tracé, ce qui l'empêchera d'être tracé.

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)
93
yoyoyoyosef

Un peu de recherche sur Google est apparu ce post ce qui ne semble pas indiquer que ggplot supporte actuellement cette option. D'autres ont résolu des problèmes connexes en utilisant gridExtra et en utilisant viewPorts comme indiqué 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 fois, une fois sans paramètre alpha et en dehors de la zone de traçage réelle. Le deuxième géom inclura le paramètre alpha et supprimera la légende. Nous spécifierons ensuite la région de traçage 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) 
5
Chase