簡體   English   中英

在ggplot2中添加手動漸變圖例

[英]Add manual gradient legend in 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()

這是此代碼生成的圖-基本上是一組具有所需顏色填充的同心環:

靶心

我想在此繪圖中添加圖例欄,以顯示從開始顏色到結束顏色的(線性)漸變,並使用df$f的最小值/最大值進行標注。

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

有沒有一種方法可以手動構造此對象並將其附加到該圖上?

我嘗試了幾件事情,目的是探索guide_colourbar()對象scale_colour_gradientn()對象,但是我無法使用這些實體將任何東西放入繪圖中。 有沒有辦法在這里使用它們?

獲得精美圖例的最簡單方法是,您實際上需要將事物映射到數據,例如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())

在此處輸入圖片說明

但是,圖例仍然不理想,因為它不是連續的,所以順序錯誤,並且顯示顏色代碼而不是標簽的值。 此外,不同的顏色在其映射值中不是等距的。

方法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')

在此處輸入圖片說明

暫無
暫無

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

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