【问题标题】:Why isn't my barplot rearranging properly when faceting with ggplot?为什么在使用 ggplot 时我的条形图没有正确重新排列?
【发布时间】:2018-10-09 11:36:28
【问题描述】:

所以我用这段代码制作了这个条形图,条形按降序排列,太棒了!

 na.omit(insect_tally_native_ranges)%>%
  group_by(native_ranges)%>%
  dplyr::summarise(freq=sum(n))%>%
  ggplot(aes(x=reorder(native_ranges,freq),y=freq))+
  geom_col(color="#CD4F39",fill="#CD4F39",alpha=0.8)+
  coord_flip()+
  labs(x="Native ranges",
       y="Number of invasive insect arrivals",
       title="Species by native ranges")+
  theme_minimal()

现在我想做同样的事情,但通过一个名为 Period 的变量进行分面,代码如下:

ggplot(native_freq_period,
         aes(y=reorder(native_ranges,freq),x=freq))+
  geom_barh(stat= "identity",
            color="#CD4F39",
            fill="#CD4F39",
            alpha=0.8)+
  labs(x="Native ranges",
       y="Number of invasive insect arrivals",
       title="Species by native ranges")+
  theme_minimal()+
  facet_wrap(~Period)

但情节是这样的:

这很烦人,因为它与上面的代码相同,变量native_ranges 的级别应该重新组织。但相反,它给了我这个甚至不是字母顺序的混乱顺序。所以reorder 部分正在重新排序,但不是freq!不明白。

这是数据:

structure(list(native_ranges = structure(c(6L, 10L, 11L, 7L, 
3L, 5L, 1L, 1L, 8L, 6L, 3L, 5L, 2L, 4L, 5L, 7L, 7L, 7L, 8L, 9L, 
11L), .Label = c("Afrotropic", "Afrotropic/Neotropic", "Australasia", 
"Australasia/Neotropic", "Indomalaya", "Nearctic", "Neotropic", 
"Neotropic/Nearctic", "Neotropic/Nearctic/Australasia", "Palearctic", 
"Palearctic/Indomalaya"), class = "factor"), Period = structure(c(4L, 
4L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 3L, 3L, 3L, 4L, 4L, 2L, 1L, 2L, 
3L, 2L, 4L, 3L), .Label = c("1896-1925", "1926-1955", "1956-1985", 
"1986-2018"), class = "factor"), freq = c(21L, 13L, 12L, 11L, 
10L, 10L, 4L, 4L, 4L, 3L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L)), row.names = c(NA, -21L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), vars = "native_ranges", drop = TRUE, indices = list(
    6:7, 12L, c(4L, 10L), 13L, c(5L, 11L, 14L), c(0L, 9L), c(3L, 
    15L, 16L, 17L), c(8L, 18L), 19L, 1L, c(2L, 20L)), group_sizes = c(2L, 
1L, 2L, 1L, 3L, 2L, 4L, 2L, 1L, 1L, 2L), biggest_group_size = 4L, labels = structure(list(
    native_ranges = structure(1:11, .Label = c("Afrotropic", 
    "Afrotropic/Neotropic", "Australasia", "Australasia/Neotropic", 
    "Indomalaya", "Nearctic", "Neotropic", "Neotropic/Nearctic", 
    "Neotropic/Nearctic/Australasia", "Palearctic", "Palearctic/Indomalaya"
    ), class = "factor")), row.names = c(NA, -11L), class = "data.frame", vars = "native_ranges", drop = TRUE))

【问题讨论】:

  • 我需要数据才能给你一个完整的答案,但我过去遇到过这个问题。基本上,coord_flip 不能很好地处理刻面。而是重新排序您的 y 变量,然后使用 ggstance 包中的 geom_barh。但是添加你的数据,我会告诉你的。
  • @BenG 谢谢!听起来很有希望。所以我已经调整了代码,应用了你推荐的 ggstance 包。但是,我得到了相同的情节而没有降级。

标签: r ggplot2 dplyr bar-chart


【解决方案1】:

您必须在绘图之前先安排变量的顺序。由于您没有提供任何可重现的数据,因此我使用以下数据

drugs <- data.frame(drug = c("a", "b", "c"), effect = c(4.2, 9.7, 6.1))
ggplot(drugs, aes(drug, effect)) +
  geom_col()

现在要更改变量的顺序使用factor

drugs$drug <- factor(drugs$drug,levels = c("b","a","c")) #This is the order I want 
ggplot(drugs, aes(drug, effect)) +
  geom_col()

这里我手动提供了factor 中的levels。您可以手动提供它们,也可以先单独对变量的顺序进行排序并提供。见下文,

drugs$drug <- factor(drugs$drug,levels = drugs[order(drugs$effect),]$drug)
ggplot(drugs, aes(drug, effect)) +
  geom_col()

这也适用于facet_wrap

【讨论】:

  • 嗨@MaMu,感谢您的评论。在第一个图中,您可以看到我实际上使用reordernative_ranges 排列为freq。我的问题更多是针对具有四个方面的第二个情节。
【解决方案2】:

好的,终于在另一个答案的帮助下弄清楚了。您需要创建另一个汇总总频率的列,以便您可以按该列重新排序。可能有一种更有效的方法,但我创建了一个新的摘要 data.frame,然后将其连接回原始数据,然后根据新列重新排序。

summary_data <- data %>%
 ungroup() %>%
 group_by(native_ranges) %>%
 summarize(total = sum(freq))

data <- data %>%
 left_join(summary_data)

ggplot(data, aes(y = reorder(native_ranges, total),x = freq)) +
 geom_barh(stat= "identity",
           color="#CD4F39",
           fill="#CD4F39",
           alpha=0.8) +
 labs(x="Native ranges",
      y="Number of invasive insect arrivals",
      title="Species by native ranges") +
 theme_minimal()+
 facet_wrap(~Period)

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多