【问题标题】:How to add legend to ggplot loadings plot?如何将图例添加到 ggplot 加载图?
【发布时间】:2020-06-14 18:38:35
【问题描述】:

因此使用 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

【问题讨论】:

  • aes 映射中指定参数时创建图例。此外,使用诸如rrload$classrow.names(rrload) 之类的硬编码元素也是一种不好的形式。现在无法输入正式答案,但今晚晚些时候可能会。

标签: r ggplot2 pca


【解决方案1】:

如果无法访问您的完整数据(您的代码无法正确重新创建数据框 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(
    name='Legend Title',
    values=c('Neutral'='bisque3','Sulfated'='springgreen3','Silylated'='orange'))

ggplot2 将为某些美学创建图例,但它们必须放在aes() 内。一旦你这样做了,ggplot2 将创建图例并自动分配颜色。这意味着如果我们要为color= 创建一个图例,您需要将它放在aes() 中。有趣的是,您可以将其放在调用中的任何位置 aes() 中,或者仅应用于特定的 geom/geoms。这为您创建绘图提供了很大的灵活性。在这种情况下,我只想为箭头着色,因此您在 geom_segment() 调用中包含 color=class。如果你把它放在ggplot() 调用中,它会为线段和文本几何图形着色。

我也在注意排序。我们要确保中心轴在 0,0 处的背景虚线位于一切“后面”,因此它们先行。然后是段,然后是文本几何。

scale_color_manual() 函数用于明确指定不同d$class 值的颜色以及图例的名称。您也可以让ggplot2 默认找到调色板,或者您可以通过调色板指定(还有很多其他方法可以指定颜色)。顺便说一句 - 您还可以通过 labs(color=... 指定图例的名称。

最后,我决定使用geom_text_repel() 而不是geom_text()。由于线条向各个方向延伸,因此每个文本项的“微调”值不会朝着相同的方向起作用。换句话说,如果您在x=PC1, y=PC2 处绘制文本,它将与箭头重叠。您也注意到了这一点并应用了nudge_ 值,这恰好可以工作,但如果您的数据有点不同,它就不会工作。来自ggrepel 包的geom_text_repel 可以通过将文本从您的观点“推开”来实现这一点。

【讨论】:

  • 这真的很有帮助。贡献图是我最初的想法,但因为它本来是要绘制我拥有的所有 63 个变量,所以我决定这样做。除非有一种方法可以执行贡献图,其中贡献最大的标签和透明度较低,而贡献最小的则褪色。谢谢!!
  • 不知道你说的贡献图是什么意思(我看到的基本上都是条形图);但是,您可以绘制所有 63 个并突出显示贡献最大的那些。如果您确实想要该问题的答案,最好将其作为单独的问题提交,并请提供您的数据和您正在尝试做什么的一般示例。顺便说一句 - 通过在 R 中加载数据框,然后将函数 dput(your.data.frame) 的输出作为代码复制并粘贴到您的问题中,可以最好地共享数据集。它确保我们可以轻松地重新创建您的数据框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多