像@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
值。
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)
這裏的具有發散顏色漸變的版本,可在範圍內創建更大的對比度個值:
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)))
好像你應該能夠像'scale_color_gradient(低= '#00000000',高= '暗粉紅')'要做到這一點,但可悲的是忽略了透明度規範(雖然它接受它...) - 也許是一個色彩空間問題。 – alistaire
你會這麼想,但我也發現在scale_color_gradient()中沒有指定alpha的效果。似乎需要有一個單獨的顏色和填充字母。 – pthomp
阿爾法是它自己的美學,這就是爲什麼'scale_alpha_continuous'存在。但是,對於'geom_tile',它隻影響填充,而不影響筆畫。'scale_color_gradient'方法有點不方便,但由於底層的顏色處理,看起來像失敗了。如果組裝得當,GitHub問題可能是一種可能性,儘管它可能因爲太多的工作而被拒絕。 – alistaire