我正在使用 geom_tile 制作一个绘图,我想根据变量指定每个图块的透明度。但是,当我用 指定 alpha 时aes(),它仅适用于填充,而不适用于颜色。这会导致图块之间的线条比图块更暗。有没有办法同时指定颜色的 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()
Run Code Online (Sandbox Code Playgroud)
就像@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)
Run Code Online (Sandbox Code Playgroud)
要将线段添加到绘图中,我们需要每次进行排序,以便分别以正确的顺序获取垂直或水平线段的 x 和 y 值。我们还使用colour="#FFFFFF00"ingeom_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)
Run Code Online (Sandbox Code Playgroud)
在下图中,您可以看到图块边框,但它们会随着图块本身一起褪色。边框有点暗,因为它们是在图块上绘制的,导致图块的不透明度大约是图块的两倍。
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)
Run Code Online (Sandbox Code Playgroud)
为了让自己相信这些段正在模仿图块颜色和 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)
Run Code Online (Sandbox Code Playgroud)
这是一个具有发散颜色渐变的版本,它在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)))
Run Code Online (Sandbox Code Playgroud)