我正在使用geom_tile制作绘图,我想根据变量指定每个贴图的透明度。但是,当我使用aes()
指定alpha时,它仅适用于填充,而不适用于颜色。这导致了图块之间的线条比图块更暗的图。有没有办法为颜色指定alpha?使用geom_raster对我来说不是一个选项,因为这是一个地图,我想使用坐标投影。删除颜色规范会使绘图看起来褪色。
以下是一些可以重现我的问题的代码。
library(ggplot2)
library(scales)
library(reshape)
volcano3d <- melt(volcano)
names(volcano3d) <- c("x", "y", "z")
ggplot(volcano3d, aes(x, y, z = z,fill=z,color=z)) +
geom_tile(aes(alpha=y))+
theme_bw()
答案 0 :(得分:3)
与@alistaire一样,在我看来,geom_tile
磁贴边框应该遵循alpha
映射,但它们似乎并不存在。作为解决方法,您可以使用geom_segment
在边框所在的相同位置绘制线段。这些段确实遵循alpha
映射。
在下面的代码中,我们首先创建一个新的数据框segs
来绘制细分。我们可以使用原始数据,但它只有一行和一列。
library(dplyr)
segs = expand.grid(x=(min(volcano3d$x)-1):max(volcano3d$x),
y=(min(volcano3d$y)-1):max(volcano3d$y)) %>%
left_join(volcano3d)
要将分段添加到绘图中,我们需要每次排序以分别为垂直或水平分段以正确的顺序获取x和y值。我们还使用colour="#FFFFFF00"
中的geom_tile
来删除默认的图块边框。
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2)
在下面的图中,您可以看到图块边框,但它们会随着图块本身一起消失。边框有点暗,因为它们被绘制在瓷砖上,导致瓷砖的不透明度大约是其两倍。
如果您希望切片边框不那么突出,则可以相对于切片alpha值缩小其alpha
值。
ggplot(volcano3d, aes(fill=z, colour=z)) +
geom_tile(colour="#FFFFFF00", aes(x, y, alpha=y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5, alpha=0.2*y), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5, alpha=0.2*y), size=0.2)
为了说服自己这些片段正在模仿平铺颜色和Alpha值,您可以删除平铺并绘制更粗的线条:
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
#geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=1.5) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=1.5)
这是一个具有发散颜色渐变的版本,可在z
值范围内创建更高的对比度:
ggplot(volcano3d, aes(fill=z, colour=z, alpha=y)) +
geom_tile(colour="#FFFFFF00", aes(x, y)) +
geom_segment(data=segs %>% arrange(x,y),
aes(x=x+0.5, xend=x+0.5, y=y+0.5, yend=lag(y)+0.5), size=0.2) +
geom_segment(data=segs %>% arrange(y,x),
aes(x=x+0.5, xend=lag(x)+0.5, y=y+0.5, yend=y+0.5), size=0.2) +
scale_fill_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z))) +
scale_colour_gradient2(low="red", mid="yellow", high="blue", midpoint=mean(range(volcano3d$z)))