[英]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.