如何用ggplot2设置图例alpha
我有一个相对于有大量积分的方向的风速图,所以我除了颜色=月份外还使用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而不是?
这里是一个例子:
更新随着0.9.0版本的发布,现在可以使用guides
function中的override.aes
来override.aes
图例中的美学值。 所以如果你添加这样的东西到你的情节:
+ guides(colour = guide_legend(override.aes = list(alpha = 1)))
应该这样做。
我通过使用数据的空子集并使用该调用中的图例对geom进行重复调用来解决此问题。 不幸的是,如果dataframe实际上是空的(如从subset(diamonds,FALSE)
diamonds subset(diamonds,FALSE)
得到的那样),它不起作用subset(diamonds,FALSE)
因为ggplot2似乎将这种情况视为与将NULL
replace为dataframe的情况相同。 但是我们可以通过只有一行的子集并将其设置为NaN
来获得相同的效果,这将防止它被绘制。
基于蔡斯的例子:
# 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)
一些谷歌search出现了这个post ,似乎并没有表明ggplot目前支持这个选项。 其他人已经通过使用gridExtra和使用viewPorts来解决相关的问题。
我不是那么复杂,但是这里有一个方法可以给你想要的结果。 方法是绘制几何graphics,一次没有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)