2017-03-02 159 views
0

我正在製作一個帶有ggplot2的「靶心」或「飛鏢板」圖。我想問問是否有辦法爲我正在創建的圖形手動添加漸變圖例,或者是否有方法修改我的過程以添加該圖例。在ggplot2中添加手動漸變圖例

這是一個可重複的數據集的工作:

step <- 0.1 
frac <- seq(0, 1, step) 
df <- data.frame(l=levels(cut(0, breaks=frac)), o=frac[1:length(frac)-1], f=c(0.000, 0.028, 0.165, 0.151, 0.149, 0.129, 0.138, 0.060, 0.090, 0.088), cols=c('#0000FF','#4343FF','#FF4343','#FF6969','#FF7070','#FFA4A4','#FF8E8E','#9D9DFF','#F0F0FF','#E8E8FF')) 

這裏是什麼樣子:

> df 
df 
      l o  f cols 
1 (0,0.1] 0.0 0.000 #0000FF 
2 (0.1,0.2] 0.1 0.028 #4343FF 
3 (0.2,0.3] 0.2 0.165 #FF4343 
4 (0.3,0.4] 0.3 0.151 #FF6969 
5 (0.4,0.5] 0.4 0.149 #FF7070 
6 (0.5,0.6] 0.5 0.129 #FFA4A4 
7 (0.6,0.7] 0.6 0.138 #FF8E8E 
8 (0.7,0.8] 0.7 0.060 #9D9DFF 
9 (0.8,0.9] 0.8 0.090 #F0F0FF 
10 (0.9,1] 0.9 0.088 #E8E8FF 

下面是可重複的代碼來生成的情節:

library(ggplot2) 
#pdf("test.pdf", width=8, height=8) 
p <- ggplot() + ylim(0, 1) + geom_rect(aes(xmin=-1, ymin=df$o, xmax=1, ymax=df$o+step), fill=df$cols) + coord_polar() + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) 
print(p) 
#dev.off() 

下面是這段代碼生成的情節 - 基本上是一組具有所需顏色填充的同心環:

Bullseye

我想圖例欄添加到該圖顯示從起始顏色結束顏色的(線性)梯度,在使用的df$f最小/最大的標籤。

我可以從df手動提供的開始和結束的顏色 - 或從單獨的colorRampPalette物體(未示出)的第一和最後一個條目 - 或提供從colorRampPalette對象的顏色陣列,以提供經內插的色彩。我只是不知道如何生成與主圖分離的圖例對象。

有沒有辦法手動構建和追加這樣的對象到這個圖上?

我嘗試過的幾件事是探索guide_colourbar() objectscale_colour_gradientn()對象,但我無法使用這些實體獲得任何東西進入我的情節。有沒有辦法在這裏使用它們?

回答

3

要獲得一個很好的圖例最簡單的方法,您需要實際將事物映射到您的數據,如ggplot背後的設計意圖。

方法1,地圖fill你的顏色變量,並使用scale_identity使用精確的顏色提供:

ggplot(df) + 
    ylim(0, 1) + 
    geom_rect(aes(xmin = -1, ymin = o, xmax = 1, ymax = o + step, fill = cols)) + 
    coord_polar() + 
    scale_fill_identity(guide = guide_legend()) 

enter image description here

圖例葉然而,應當希望的,因爲它是不連續的,它會以錯誤的方式排列,並顯示顏色代碼而不是標籤的值。此外,不同顏色的映射值不是等距的。

方法2,您可以使用實際的連續比例(您沒有提供)以獲得合適的顏色條。這裏有一個你可以嘗試的嘗試,我讓ggplot從你的極端值通過白色創建一個連續的規模。

ggplot(df) + 
    ylim(0, 1) + 
    geom_rect(aes(xmin = -1, ymin = o, xmax = 1, ymax = o + step, fill = f)) + 
    coord_polar() + 
    scale_fill_gradient2(midpoint = mean(range(df$f)), low = '#0000FF', high = '#FF4343') 

enter image description here

+1

我還在學習ggplot讓我欣賞的那種幫助。 –