[英]How to add legend to ggplot loadings plot?
因此,使用 ggplot 命令通過箭頭樣式創建了載荷 plot。 為了使繪圖更容易,我在我的 rr.pr$rotation 代碼的 dataframe 中添加了一個帶有顏色的列,以便它根據我指定的顏色繪制這些箭頭。 與箭頭匹配的顏色很重要,這就是我這樣做的原因。 我現在無法添加圖例,因為 ggplot 沒有添加圖例。 有沒有辦法添加一個或者我必須對 dataframe 做些什么?
我正在考慮手動添加顏色,但我被卡住了。
綠色代表硫酸化,橙色代表唾液酸化,棕色代表中性。 我希望傳奇能夠證明這一點。
這是代碼:
Dataframe
rrload<-data.frame(rr.pr$rotation[c(2,15,17,24,52),c(1:5)])
rrload$class<-c('orange','springgreen3','bisque3','bisque3','bisque3')
rrload1<-rrload[,c(1:5)]
rrload1<-as.numeric(as.matrix(rrload1))
rrload1<-matrix(rrload1,nrow=5,ncol=5,byrow = F)
rrload[,c(1:5)]<-rrload1
繪制它的代碼:
ggplot(rrload)+geom_segment(aes(xend=PC1,yend=PC2),x=0,y=0,arrow = arrowstyle2,color=rrload$class)+
geom_text(aes(x=PC1,y=PC2,label=row.names(rrload)),hjust=0,nudge_x = -0.05,vjust=1,nudge_y = 0.025,size=3.5,color='black')+xlim(-0.3,0.3)+ylim(-0.3,0.3)+theme_light()+
theme_minimal()+theme(legend.title = element_text("Class"),axis.text.x = element_text(colour = "black",size = 10),axis.text.y = element_text(colour = "black",size = 10),axis.title.x = element_text(colour = "black",size = 10),axis.title.y = element_text(colour = "black",size = 10),axis.ticks = element_line(color = "black"),panel.grid = element_blank(), panel.border = element_rect(colour = "black",fill = NA,size = 1))+geom_hline(yintercept = 0,linetype="dashed",color="gray69")+geom_vline(xintercept = 0,linetype="dashed",color="gray69")
這是圖表:
如果無法訪問您的全部數據(您的代碼無法重新創建 dataframe, rrload
正確),很難提供幫助。 我設法根據您共享的 plot 估算了數字。 這是我使用的 dataframe - 請注意列的命名約定:
d <- data.frame(
PC1=c(-0.2,-0.2,0.1,0.15,-0.08),
PC2=c(0.13,-0.1,0.2,0.1,-0.2300),
class=c('Neutral','Neutral','Neutral','Sulfated','Silylated'),
name=c('o53','o18','o25','o15','o2')
)
為了准備繪圖數據,我包含d$name
和d$class
。 d$class
類似於您擁有的列,盡管我使用的是實際名稱而不是顏色。 d$name
是我用於 plot 您的標簽的名稱。
這是我使用的代碼和生成的 plot。 解釋將在之后:
library(ggrepel)
ggplot(d) + theme_classic() +
geom_vline(xintercept=0, linetype=2, color='gray60') +
geom_hline(yintercept=0, linetype=2, color='gray60') +
geom_segment(
aes(xend=PC1,yend=PC2, color=class), x=0,y=0,
arrow=arrow(type='closed', angle=20, length=unit(0.02,'npc'))
) +
geom_text_repel(
aes(x=PC1, y=PC2, label=name), force=6, min.segment.length = 10, seed=123
) +
ylim(-0.3,0.3) + xlim(-0.3,0.3) +
scale_color_manual(
name='Legend Title',
values=c('Neutral'='bisque3','Sulfated'='springgreen3','Silylated'='orange'))
ggplot2
將為某些美學創建圖例,但它們必須放在aes()
中。 一旦你這樣做了, ggplot2
將創建圖例並自動分配 colors。 這意味着如果我們想為color=
創建一個圖例,您需要將它放在aes()
中。 有趣的是,您可以將它放在調用中的任何位置的aes()
中,或者只應用於特定的 geom/geoms。 這為創建 plot 提供了很大的靈活性。 在這種情況下,我只想為箭頭着色,因此您在geom_segment()
調用中包含color=class
。 如果你把它放在ggplot()
調用中,它會為線段和文本幾何圖形着色。
我也在注意排序。 我們要確保中心軸在 0,0 處的背景虛線在一切“后面”,所以它們首先是 go。 然后是段,然后是文本幾何。
scale_color_manual()
function 用於為不同的d$class
值明確指定 colors 和圖例的名稱。 您也可以讓ggplot2
默認找到調色板,或者您可以通過調色板指定(還有很多其他方法可以指定顏色)。 順便說一句 - 您還可以通過labs(color=...
指定圖例的名稱。
最后,我決定使用geom_text_repel()
而不是geom_text()
。 由於行 go 在各個方向上,每個文本項的“微調”值不會在同一方向上起作用。 換句話說,如果您 plot x=PC1, y=PC2
處的文本,它將與箭頭重疊。 您也注意到了這一點並應用nudge_
值,這恰好起作用,但如果您的數據有點不同,它就不會起作用。 來自geom_text_repel
ggrepel
的geom_text_repel 可以通過將文本從您的觀點“推”開來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.