【问题标题】:Facet_Wrap labels in RR中的Facet_Wrap标签
【发布时间】:2018-09-04 21:36:36
【问题描述】:

我正在尝试更改带有刻面的 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)

我查看了 labeller 函数和不同的选项,但其中大多数似乎是针对包含在构面中的变量。有没有办法做到这一点?任何线索表示赞赏,谢谢!

【问题讨论】:

    标签: r ggplot2 facet-wrap


    【解决方案1】:

    您可以即时创建一个新的分面列并避免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)
    

    【讨论】:

    • 谢谢你,但我已经创建了一个新的分面列,所以这对我来说行不通。 iris 示例只是为了重现我所面临的问题,但感谢您的回复!
    • 您仍然可以使用此方法。只需通过将新的构面列粘贴到您用于均值的任何列的均值来创建标签列。
    【解决方案2】:

    根据?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))))
    

    此外,创建标签的更简洁的方法是不使用map2

    lbls &lt;- setNames(paste(unique(iris$Species), lbls, sep = "\n"), unique(iris$Species))

    【讨论】:

    • 谢谢,这很好用!我错过了 wrap 部分以及传递了 faceting 变量。我想我应该花更多时间阅读文档
    • @MridulGarg 贴标机功能和文档肯定会令人困惑。特别是如果您决定使用自己的函数而不是命名向量
    猜你喜欢
    • 2023-03-02
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2021-10-26
    • 2015-01-17
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多