2017-02-11 140 views
1

我正在使用geom_tile繪製一幅圖,我想根據變量指定每個圖塊的透明度。但是,當我用aes()指定alpha時,它僅適用於填充,而不適用於顏色。這導致了瓦片之間的線條比瓦片暗的情節。有沒有辦法爲顏色指定alpha?使用geom_raster對我來說不是一種選擇,因爲這是用於地圖的,我想使用座標投影。刪除顏色規格會使情節看起來不合時宜。如何爲填充和顏色指定alpha值geom_tile

這裏是一些代碼,再現我的問題。

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

好像你應該能夠像'scale_color_gradient(低= '#00000000',高= '暗粉紅')'要做到這一點,但可悲的是忽略了透明度規範(雖然它接受它...) - 也許是一個色彩空間問題。 – alistaire

+0

你會這麼想,但我也發現在scale_color_gradient()中沒有指定alpha的效果。似乎需要有一個單獨的顏色和填充字母。 – pthomp

+0

阿爾法是它自己的美學,這就是爲什麼'scale_alpha_continuous'存在。但是,對於'geom_tile',它隻影響填充,而不影響筆畫。'scale_color_gradient'方法有點不方便,但由於底層的顏色處理,看起來像失敗了。如果組裝得當,GitHub問題可能是一種可能性,儘管它可能因爲太多的工作而被拒絕。 – alistaire

回答

2

像@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值。

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

這裏的具有發散顏色漸變的版本,可在範圍內創建更大的對比度個值:

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