如何使用ggplot2设置图例alpha


81

我有一个风速相对于方向的图表,该图表具有很大的点数,因此除了color = month外,还使用alpha = I(1/20)

这是代码示例:

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?

这是一个例子: 示例图

Answers:


110

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

+ 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
辉煌。这个解决方案是惊人的。只是尝试了一下而已。享受美食
克里斯(Chris

3
+1以获取@joran的更新(以及现在不再需要的强大技巧)
Gregor Thomas

我正在使用0.9.3.1版,但对我而言不起作用。我把guides()函数放在了不同的位置,但是我没有得到预期的行为。有什么提示吗?
极化

要添加到旧线程中,必须colour根据用于设置颜色的内容进行更改。例如,guides(fill = guide_legend(...))由于使用aes(fill = val)了我的绘图,所以使用了上述解决方案
Mxblsdl

4

有点谷歌搜索了这篇文章,这似乎并不表明ggplot当前支持此选项。其他人使用解决相关问题gridExtra并使用视口中显示为讨论在这里

我没有那么复杂,但是这里有一种方法应该可以为您带来理想的结果。方法是绘制几何图形两次,一次不使用alpha参数,并且在实际绘制区域之外。第二个几何图形将包含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) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.