如何将图例添加到ggplot加载图?

问题描述 投票:-2回答:1

因此使用ggplot命令通过箭头样式创建了一个荷载图。为了使绘图更容易,我在rr.pr $ rotation代码的数据框中添加了带有颜色的列,以便它根据我指定的颜色绘制这些箭头。与箭头匹配的颜色很重要,这就是我这样做的原因。我现在无法添加图例,因为ggplot没有添加图例。有没有一种方法可以添加一个,或者我必须对数据框做些什么?

我当时想手动添加颜色,但是我陷入了困境。

绿色代表被硫酸化,橙色代表唾液酸化,而棕色代表中性。我希望传说能够证明这一点。

这里是代码:

数据框

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")

这是图形:

Loadings plot

r ggplot2 pca
1个回答
0
投票

无法访问您的完整数据(您的代码无法重新创建数据框,正确地为rrload),很难提供帮助。我设法根据您共享的地块估算了数字。这是我使用的数据框-请注意各列的命名约定:

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$named$classd$class与您所拥有的列相似,尽管我使用的是实际名称而不是颜色。 d$name是我用来绘制标签的名称。

这是我使用的代码和结果图。解释如下:

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(
    values=c('Neutral'='bisque3','Sulfated'='springgreen3','Silylated'='orange'))

enter image description here

ggplot2将为某些美学创建图例,但必须将其放置在aes()中。完成此操作后,ggplot2将创建图例并自动分配颜色。这意味着,如果我们要为color=创建图例,则需要将其放在aes()中。有趣的是,您可以将其放在调用中的aes()中的任何位置,或仅应用于特定的geom / geom。这在创建绘图时提供了很大的灵活性。在这种情况下,我只想给箭头涂上颜色,因此您可以在color=class调用中包括geom_segment()。如果将其放在ggplot()调用中,它将为线段以及文本geom着色。

我也注意订购。我们要确保中心轴线在0,0处的背景虚线位于所有内容的“后面”,因此它们排在第一位。然后是句段,然后是文本geom。

scale_color_manual()功能用于显式指定不同d$class值的颜色。您也可以默认让ggplot2查找调色板,或者可以通过调色板指定(有很多其他方法可以指定颜色)。

最后,我决定使用geom_text_repel()而不是geom_text()。由于行向各个方向延伸,因此每个文本项的“微调”值将无法沿相同方向运行。换句话说,如果将文本绘制在x=PC1, y=PC2处,它将与箭头重叠。您也注意到了这一点,并应用了nudge_值,该值恰好起作用,但是,如果您的数据有些不同,它将无法起作用。 geom_text_repel包中的ggrepel可以通过将文本“推开”到远离您的要点的位置来完成此工作。

© www.soinside.com 2019 - 2024. All rights reserved.