R:ggbiplot - 为啥我不能用 guide_legend 控制图例列的数量?

Posted

技术标签:

【中文标题】R:ggbiplot - 为啥我不能用 guide_legend 控制图例列的数量?【英文标题】:R: ggbiplot - why can't I control the number of legend columns with guide_legend?R:ggbiplot - 为什么我不能用 guide_legend 控制图例列的数量? 【发布时间】:2020-11-12 21:58:47 【问题描述】:

我经常使用ggbiplot,并且可以控制使用ggplot2 工具生成的情节的各个方面,因为它继承自ggplot2...

ggplot2中,我一般用一行的形式来控制图例中的列数:

ggplot2::guides(fill=ggplot2::guide_legend(ncol=2))

但是,这似乎在 ggbiplot 中不起作用(而其他所有与 ggplot2 相关的东西都起作用)。

请使用iris 数据检查下面的 MWE,我在这里要做的唯一事情是为图例指定 2 列(为了说明目的,我知道只有 3 个物种级别,但这是我的示例手头更多)。

library(ggbiplot)
data(iris)
pca.obj <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE)
P <- ggbiplot(pca.obj,
              obs.scale = 1,
              var.scale=1,
              ellipse=T,
              circle=F,
              varname.size=3,
              var.axes=T,
              groups=iris$Species, #no need for coloring, I'm making the points invisible
              alpha=0) + #invisible points, I add them below
ggplot2::theme_light() +
ggplot2::scale_color_manual("spec", values=c("red","black","pink"), guide=ggplot2::guide_legend(override.aes=list(shape=19, size=5, linetype=0))) +
ggplot2::guides(fill=ggplot2::guide_legend(ncol=2)) #THIS DOES NOT WORK HERE, WHY?
P$layers <- c(geom_point(aes(color=iris$Species), cex=3), P$layers) #add geom_point in a layer underneath (only way I have to change the size of the points in ggbiplot)
png(filename="test.png", height=600, width=600)
print(#or ggsave()
  P
)
dev.off()

这会产生以下双标图:

查看图例中的列数如何永远不变...有没有办法指定ggbiplot 中的图例列数?谢谢

【问题讨论】:

我没有尝试过您的代码,但您似乎将 color 映射到“物种”(groups=iris$Speciesscale_color_manual),但随后您尝试编辑填充比例(guides(fill=)。你可以试试guides(color=吗? 这只是证明我可以使用ggplot2工具修改图例中的其他方面,这部分有效。我不在乎着色,它只是图例ncol 不起作用... 我想说的是你没有填充图例 - 你有一个 color 图例 - 但是当你尝试要修改 ncol,请参考(不存在的)fill 图例 (guides(fill=)。 另外,alpha=0 + P$layers &lt;- c(geom_point(aes(color=iris$Species), cex=3), P$layers) 可以替换为geom_point(aes(color = iris$Species), size = 3) 我应该添加一个scale_fill_manual 条目吗?至于你的第二点,我真的需要在做这些双标图时玩这样的图层,否则如果有很多点,这些点会被绘制在矢量箭头的顶部,完全掩盖它们 【参考方案1】:

在对guide_legend() 的第一次调用中包含ncol = 2 会更简单。即

library(ggbiplot)
data(iris)
pca.obj <- prcomp(iris[,1:4], center=TRUE, scale.=TRUE)
P <- ggbiplot(pca.obj,
              obs.scale = 1,
              var.scale=1,
              ellipse=T,
              circle=F,
              varname.size=3,
              var.axes=T,
              groups=iris$Species, #no need for coloring, I'm making the points invisible
              alpha=0) + #invisible points, I add them below
ggplot2::theme_light() +
ggplot2::scale_color_manual("spec", values=c("red","black","pink"), guide=ggplot2::guide_legend(ncol = 2, override.aes=list(shape=19, size=5, linetype=0))) # +
# ggplot2::guides(fill=ggplot2::guide_legend(ncol=2)) #THIS DOES NOT WORK HERE, WHY?
P$layers <- c(geom_point(aes(color=iris$Species), cex=3), P$layers) #add geom_point in a layer underneath (only way I have to change the size of the points in ggbiplot)
png(filename="test.png", height=600, width=600)
print(#or ggsave()
  P
)
dev.off()

正如 Henrik 所说,这归结为 fill = color = 之间的不匹配。

【讨论】:

是的,就是这样!我以为我以前尝试过,但我想我可能在override.aes=list() 中包含了ncol

以上是关于R:ggbiplot - 为啥我不能用 guide_legend 控制图例列的数量?的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令,为啥用cp -r /etc/ /tmp不能做到复制呢?

为啥我的 UIDynamicAnimator 类继承不能使用 addChildBehavior

为啥 R 的 ifelse 语句不能返回向量?

为啥 R 不能在一组空索引上正确删除元素?

为啥 R 在多年之间不能始终如一地处理夏令时?

为啥jquery在我的html中不能用?