在R中将Facet_Wrap标签包装起来

8

我正在尝试在具有面板的ggplot图形中更改标签,并使用来自未分面数据框的变量。 代码如下:

iris %>%
  group_by(Species) %>%
  summarise(lbl = mean(Petal.Length)) %>%
  select(lbl) %>%
  unlist() -> lbls
lbls <- map2(unique(iris$Species), lbls, paste, sep = "\n")
iris %>%
  ggplot(aes(x = Sepal.Length, y = Sepal.Width, group = 1)) +
  geom_point() +
  facet_wrap(~ Species, labeller = lbls)

然而,这会导致以下错误 -
Error in cbind(labels = list(), list(`{`, if (!is.null(.rows) || 
!is.null(.cols)) { : 
 number of rows of matrices must match (see arg 2)

我已经查看了标签功能和不同的选项,但大多数都是针对包含在 facets 中的变量。有没有办法实现这个?任何线索都将不胜感激,谢谢!

2个回答

7
从关于?labeller的文档中可以看到,labeller也可以是一个命名的字符向量。需要注意的是,我们需要将字符向量包裹在labeller函数中。同样地,在查看帮助文件中的示例时,我们需要将分面变量Species作为labeller的参数传递。因此调用应该类似于: labeller = labeller(Species = setNames(unlist(lbls), unique(iris$Species))) 然后代码应该是:
iris %>%
  ggplot(aes(x = Sepal.Length, y = Sepal.Width, group = 1)) +
  geom_point() +
  facet_wrap(~ Species, labeller = labeller(Species = setNames(unlist(lbls), unique(iris$Species))))

此外,创建标签的更干净的方式是不使用map2lbls <- setNames(paste(unique(iris$Species),lbls, sep="\n"), unique(iris$Species)) enter image description here

谢谢,这个很好用!我错过了wrap部分以及传递faceting变量。我想我应该花更多时间阅读这方面的文档。 - Mridul Garg
@MridulGarg 标签函数和文档确实会让人感到困惑。特别是如果你决定使用自己的函数而不是命名向量。 - Mike H.

6

您可以即时创建一个新的分面列,并避免 labeller 的烦恼:

iris %>%
  group_by(Species) %>% 
  mutate(label = paste0(Species, "\n", round(mean(Petal.Length),2))) %>% 
  ggplot(aes(x = Sepal.Length, y = Sepal.Width, group = 1)) +
    geom_point() +
    facet_wrap(~ label)

enter image description here


谢谢你的回复,但我已经在为分面创建一个新列,所以这对我来说行不通。虹膜示例只是为了重现我遇到的问题,但我感谢你的回复! - Mridul Garg
你仍然可以使用这种方法。只需通过将新的分面列粘贴到您用于平均值的任何列的平均值来创建标签列。 - eipi10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接