我有一个风速与方向的图表,它有一个巨大的点数,所以我使用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()
Run Code Online (Sandbox Code Playgroud)
这会产生一个不错的图形,但我的问题是图例的alpha也是1/30,这使得它不可读.有没有办法可以强制传说为1 alpha?
这是一个例子:

yoy*_*sef 97
更新随着0.9.0版的发布,现在可以override.aes在guides函数中使用图例中的美学值.所以,如果你在你的情节中添加这样的东西:
+ guides(colour = guide_legend(override.aes = list(alpha = 1)))
Run Code Online (Sandbox Code Playgroud)
应该这样做.
我通过使用空的数据子集并使用该调用的图例对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)
Run Code Online (Sandbox Code Playgroud)
一些谷歌搜索出现了这篇文章,似乎并没有表明ggplot目前支持这个选项.其他人使用解决相关问题gridExtra并使用视口中显示为讨论在这里.
我不是那么复杂,但这里有一种方法可以给你想要的结果.方法是将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)
Run Code Online (Sandbox Code Playgroud)