R中的Facet_Wrap标签

时间:2018-03-26 16:47:07

标签: r ggplot2 facet-wrap

我正在尝试使用facet更改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)

我查看了贴标机功能和不同的选项,但大多数似乎是针对包含在facet中的变量。有没有办法可以做到这一点?任何领导都表示赞赏,谢谢!

2 个答案:

答案 0 :(得分:1)

?labeller上的文档中,labeller也可以是命名字符向量。请注意,我们需要将字符向量包装在labeller函数中。另外,通过查看帮助文件中的示例,我们需要将facetting变量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 <- setNames(paste(unique(iris$Species), lbls, sep = "\n"), unique(iris$Species))

enter image description here

答案 1 :(得分: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)

enter image description here