如何使用ggplot2设置图例alpha

时间:2011-03-13 14:29:37

标签: r ggplot2

我有一个风速与方向的图表,其中有一个巨大的点数,所以我使用alpha = I(1/20)除了color = month

以下是代码示例:

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

这产生了一个不错的图形,但是我的问题是图例的alpha也是1/30,这使得它不可读。有没有办法可以强制传奇变为1 alpha?

这是一个例子: Example Graph

2 个答案:

答案 0 :(得分:93)

更新随着版本0.9.0的发布,现在可以使用override.aes函数中的guides覆盖图例中的美学值。所以,如果你在你的情节中添加这样的东西:

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

应该这样做。


我通过使用数据的空子集并使用该调用的图例对geom进行重复调用来解决这个问题。不幸的是,如果数据框实际上是空的(例如,当你从subset(diamonds,FALSE)获得)时,它不起作用,因为ggplot2似乎对待这种情况与处理NULL代替数据相同帧。但是我们可以通过仅使用一行的子集并在其中一个绘图维度上将其设置为NaN来获得相同的效果,这将阻止它被绘制。

基于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)

答案 1 :(得分:5)

一些谷歌搜索出现this post,这似乎并不表示ggplot目前支持此选项。其他人使用gridExtra并使用所讨论的here的viewPorts解决了相关问题。

我不是那么复杂,但这里有一种方法可以给你想要的结果。方法是将geom绘制两次,一次没有alpha参数,并且在真实绘图区域之外。第二个geom将包含alpha参数并抑制图例。然后我们将使用xlim和ylim指定绘图区域。鉴于你有很多分数,这将大约是绘图时间的两倍,但是应该给你效果。

使用钻石数据集:

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