簡體   English   中英

如何為填充和顏色geom_tile指定alpha

[英]How to specify alpha for both fill and colour geom_tile

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

就像@alistaire一樣,在我看來geom_tile 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相對於瓷磚阿爾法值的值。

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

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM