R,ggplot2,限制多面条形图中的行

Sup

请考虑以下几行:

数据

df=data.frame(
      prod=sample(1:30,1000,replace=TRUE),mat=sample(c('yes','no'),fj=sample(c(1,2),replace = TRUE)
      )

情节

df %>%
  group_by(mat,prod,fj) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  slice(1:5) %>%
  ggplot(aes(x = reorder(prod,n),y = n)) +
  geom_col(fill = RColorBrewer::brewer.pal(3,'Dark2')[2],colour = "grey",alpha = 0.8) +
  labs(x = "Prod",y = "Qnt") +
  scale_y_continuous(labels = scales::comma) +
  coord_flip() +
  facet_wrap(fj ~ mat,scale="free") +
  theme_minimal()

这给了我

R,ggplot2,限制多面条形图中的行

现在,如果我删除fj变量,如

df %>%
  group_by(mat,prod) %>% 
  summarise(n = n()) %>% 
  arrange(desc(n)) %>%
  slice(1:5) %>%
  ggplot(aes(x = reorder(prod,y = "Qnt") +
  scale_y_continuous(labels = scales::comma) +
  coord_flip() +
  facet_wrap(~ mat,scale="free") +
  theme_minimal()

slice(1:5)完成了任务,我得到了:

R,ggplot2,限制多面条形图中的行

问题

当存在3个以上变量时,为什么slicereorder似乎无法正常工作,我应该怎么做才能将第一个图限制为每行5条?

beibeiji 回答:R,ggplot2,限制多面条形图中的行

拨打summarize时,您将失去一个分组级别。在这种情况下,您丢失了fj,因此slice不在组划分中。

如果您先ungroup然后group_by垫子和fj,我想您最终会找到想要的东西。

df %>%
      group_by(mat,prod,fj) %>% 
      summarise(n = n()) %>% 
      ungroup()%>%
      group_by(mat,fj) %>% 
      arrange(desc(n)) %>%
      slice(1:5) %>%
      ggplot(aes(x = reorder(prod,n),y = n)) +
      geom_col(fill = RColorBrewer::brewer.pal(3,'Dark2')[2],colour = "grey",alpha = 0.8) +
      labs(x = "Prod",y = "Qnt") +
      scale_y_continuous(labels = scales::comma) +
      coord_flip() +
      facet_wrap(fj ~ mat,scale="free") +
      theme_minimal()

enter image description here

这留下了在每个方面内重新排序prod变量的问题。在上面的示例中,它不起作用,因为您要按整个数据帧排序,并且Prod的某些值会在多个构面上重复。如@drsimonj在blog post中所讨论的,您需要创建一个订单变量并基于该变量进行绘制。这是/巧妙地复制了博客文章中概述的方法。

df %>%
      group_by(mat,fj) %>% 
      summarise(n = n()) %>% 
      group_by(mat,fj) %>% 
      arrange(desc(n)) %>%
      slice(1:5) %>%
      ungroup() %>%
      arrange(fj,mat,n) %>%  # arrange the entire table by the facets first,then by the n value
      mutate(row.order = row_number()) %>%  # create dummy variable
      ggplot(aes(x = row.order,y = n)) +  # plot by the dummy variable
      geom_col(fill = RColorBrewer::brewer.pal(3,alpha = 0.8,position = "dodge") +
      labs(x = "Prod",y = "Qnt") +
      scale_y_continuous(labels = scales::comma) +
      scale_x_continuous(   # add back in the Prod values 
            breaks = df2$row.order,labels = df2$prod
      )+
      coord_flip() +
      facet_wrap(fj ~ mat,scales = "free") +
      theme_minimal()

enter image description here

本文链接:https://www.f2er.com/3164717.html

大家都在问