如何使用ggplot2设置图例的透明度

100

我有一个风速和方向的图表,数据点非常多,因此我使用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?

这里是一个示例: 示例图形

2个回答

145

更新 自版本0.9.0发布以来,现在可以使用guides函数中的override.aes覆盖图例中的美学值。因此,如果您将以下内容添加到您的绘图中:

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

这样就可以了。


我通过使用数据的空子集并使用该调用的图例来解决了这个问题。不幸的是,如果数据框实际上为空(例如从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
太棒了!这个解决方案真是太神奇了。我刚刚尝试了一下,效果非常好。 - Chris
3
支持 @joran 的更新(这是一种现在已经不再需要的很棒的技巧)。 - Gregor Thomas
我正在使用版本0.9.3.1,但它对我不起作用。我已经将“guides()”函数放在各种位置,但我没有得到预期的行为。有什么提示吗? - polarise
1
要在旧线程中添加内容,您必须根据所用于设置颜色的内容更改 colour。例如,我使用了上面的解决方案,并使用了 guides(fill = guide_legend(...)),因为我在绘图时使用了 aes(fill = val) - Mxblsdl

4
一番搜索之后我找到了这篇文章,它似乎并没有指出ggplot当前支持该选项。其他人通过使用gridExtra和讨论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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接