我图例上的形状似乎与情节 ggplot2 中显示的顺序不同

Posted

技术标签:

【中文标题】我图例上的形状似乎与情节 ggplot2 中显示的顺序不同【英文标题】:Shapes on my legend seem to be in a different order than that shown in plot ggplot2 【发布时间】:2021-12-20 22:41:16 【问题描述】:

我在 R 中有一个包含 PCA 数据的数据框,大致如下:

obsnames PC1 PC2 PC3
one 2.46 2.57 1.366962e-15
two -3.47 0.84 3.053113e-16
three 1.01 -3.40 7.077672e-16

你可以用这个加载确切的变量:

structure(list(obsnames = c("one", "two", "three"), PC1 = c(2.46310908247957, 
-3.46877162330214, 1.00566254082257), PC2 = c(2.56831624877025, 
0.836571395923965, -3.40488764469422), PC3 = c(1.36696209906972e-15, 
3.05311331771918e-16, 7.07767178198537e-16), `Sample Size` = c(48L, 
74L, 52L)), row.names = c("one", "two", "three"), class = "data.frame")

现在。我试图通过仅使用那些允许“填充”美学(21-25 iirc)的形状来用 ggplo2 geom_point 绘制这个 PCA。但是,我在创建图例以使其与图中显示的形状和颜色相匹配时遇到问题。我放弃了自己去想办法,而且我觉得这很奇怪,因为我几乎都是手动喂它的。这是我的绘图线:

len <- length(pca_data$obsnames)
ggplot(pca_data, aes_string(x=x, y=y)) + 
  geom_point(shape = rep_len(c(21, 22, 23, 24, 25) length.out = 
  len),   
             color = "black", size = 3, aes(fill=obsnames)) + 
  theme_bw() + 
  theme(legend.position="right") + 
  xlab(label_x) + 
  ylab(label_y) + 
  ggtitle(main) + 
  theme(plot.title = element_text(hjust = 0, face="bold")) + 
  geom_hline(aes(0), size=.2,yintercept=0) + 
  geom_vline(aes(0), size=.2,xintercept=0) + 
  coord_equal() + 
  geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 3, vjust=0.3, color="grey", fontface="bold") + 
  geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), color="grey", linetype="dotted") + 
  scale_fill_manual(values = rep_len(c("red", "blue", "green", "orange", "yellow", "purple", "pink", "light blue", "white", "black", "gold"), length.out = len)) + 
  guides(fill=guide_legend(override.aes=list(shape=rep_len(c(21, 22, 23, 24, 25), length.out = len))))

输出如下图:

如您所见。图例将“二”显示为绿色菱形,而实际上它应该是绿色的正方形。此外,当我碰巧使用与形状向量中的形状相同数量的点(obsnames)时:c(21, 22, 23, 24, 25);即5,则问题不出现。但我真的不明白我做错了什么......

【问题讨论】:

【参考方案1】:

如果您让ggplot 处理它,这是一种效果更好的事情;也就是说,通过确保将形状/填充规范放在aes() 中。为了这个演示,我稍微减少了你的情节的特点;重新添加它们应该不会太难。更重要的是,请注意我创建了一个 named 向量作为 scale_*_manual()values 参数传递;这确保值和标签将以正确的方式匹配:

len <- length(pca_data$obsnames)
shapes <- rep_len(x = c(21, 22, 23, 24, 25), length.out = len)
ptcols <- rep_len(x = c(
    "red", "blue", "green", "orange", "yellow", "purple", "pink",
    "light blue", "white", "black", "gold"
), length.out = len)
names(shapes) <- pca_data$obsnames
names(ptcols) <- pca_data$obsnames
ggplot(data = pca_data, mapping = aes(x = PC1, y = PC2)) +
    geom_point(aes(shape = obsnames, fill = obsnames), color = "black") +
    scale_fill_manual(values  = ptcols) +
    scale_shape_manual(values = shapes) +
    theme_bw()

【讨论】:

以上是关于我图例上的形状似乎与情节 ggplot2 中显示的顺序不同的主要内容,如果未能解决你的问题,请参考以下文章

难以获得混合线a和指向ggplot2中颜色和形状的点图例

如何使 ggplot2 中的图例与我的情节高度相同?

使用ggplot2为甘特图创建图例

ggplot2 中图例的自定义顺序,因此它与图中因子的顺序不匹配

使用 ggplot2 创建带有形状的图例

在 ggplot2 中,使用两种图形类型时如何缩放图例?