如何为填充和颜色geom_tile

时间:2017-02-11 21:16:01

标签: r ggplot2 alpha

我正在使用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()

1 个答案:

答案 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)

在下面的图中,您可以看到图块边框,但它们会随着图块本身一起消失。边框有点暗,因为它们被绘制在瓷砖上,导致瓷砖的不透明度大约是其两倍。

enter image description here

如果您希望切片边框不那么突出,则可以相对于切片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)

enter image description here

为了说服自己这些片段正在模仿平铺颜色和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)

enter image description here

这是一个具有发散颜色渐变的版本,可在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)))

enter image description here