R 为什么不是';当使用ggplot刻面时,我的条形图是否正确重新排列?

R 为什么不是';当使用ggplot刻面时,我的条形图是否正确重新排列?,r,ggplot2,dplyr,bar-chart,R,Ggplot2,Dplyr,Bar Chart,所以我用这个代码做了这个条形图,按降序排列,棒极了 现在我想做同样的事情,但是通过一个名为Period的变量来刻面,下面是代码: ggplot(native_freq_period, aes(y=reorder(native_ranges,freq),x=freq))+ geom_barh(stat= "identity", color="#CD4F39", fill="#CD4F39", alpha

所以我用这个代码做了这个条形图,按降序排列,棒极了

现在我想做同样的事情,但是通过一个名为
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
的级别应该重新组织。但是它给了我这个不规则的顺序,甚至不是字母顺序。因此,
重新排序
部件是重新排序的,但不是通过
频率
!我不明白

以下是数据:

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))

在打印之前,必须先排列变量的顺序。由于您没有提供任何可复制的数据,我使用以下数据

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

在这里,我手动提供了
因子中的
级别。您可以手动提供它们,也可以先对变量的顺序进行单独排序,然后提供。见下文

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

drugs$druge在绘图之前,必须先安排变量的顺序。由于您没有提供任何可复制的数据,我使用以下数据

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

在这里,我手动提供了
因子中的
级别。您可以手动提供它们,也可以先对变量的顺序进行单独排序,然后提供。见下文

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

drugs$druge好的,在另一个答案的帮助下终于找到了答案。您需要创建另一列来汇总总频率,以便可以按该列重新排序。可能有更有效的方法,但我创建了一个新的summary 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)
汇总数据%
解组()%>%
分组依据(本地范围)%>%
汇总(总计=总计(频率))
数据%
左连接(汇总数据)
ggplot(数据,aes(y=重新排序(本机范围,总计),x=频率))+
geom_barh(stat=“identity”,
color=“#CD4F39”,
fill=“#CD4F39”,
α=0.8)+
实验室(x=“本机范围”,
y=“入侵昆虫数量”,
title=“按本地范围划分的物种”)+
主题_极小值()+
面_包裹(~周期)

好的,在另一个答案的帮助下,终于找到了答案。您需要创建另一列来汇总总频率,以便可以按该列重新排序。可能有更有效的方法,但我创建了一个新的summary 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)
汇总数据%
解组()%>%
分组依据(本地范围)%>%
汇总(总计=总计(频率))
数据%
左连接(汇总数据)
ggplot(数据,aes(y=重新排序(本机范围,总计),x=频率))+
geom_barh(stat=“identity”,
color=“#CD4F39”,
fill=“#CD4F39”,
α=0.8)+
实验室(x=“本机范围”,
y=“入侵昆虫数量”,
title=“按本地范围划分的物种”)+
主题_极小值()+
面_包裹(~周期)

我需要这些数据来给你一个完整的答案,但我过去也遇到过这个问题。基本上,
coord\u flip
不能很好地处理刻面。而是对y变量重新排序,然后使用
ggstance
包中的
geom\u barh
。但是添加您的数据,我会给您看。@BenG谢谢!听起来很有希望。因此,我已根据您对
ggstance
软件包的建议对代码进行了调整。然而,我得到的是相同的图,没有下降的水平。我需要数据给你一个完整的答案,但我在过去遇到过这个问题。基本上,
coord\u flip
不能很好地处理刻面。而是对y变量重新排序,然后使用
ggstance
包中的
geom\u barh
。但是添加您的数据,我会给您看。@BenG谢谢!听起来很有希望。因此,我已根据您对
ggstance
软件包的建议对代码进行了调整。然而,我得到的是相同的情节,没有下降的层次。嗨@MaMu,谢谢你的评论。在第一个图中,您可以看到我实际上使用了
重新排序
来按
频率
排列
本机范围
。我的问题更多的是针对第二个情节的四个方面。嗨@MaMu,谢谢你的评论。在第一个图中,您可以看到我实际上使用了
重新排序
来按
频率
排列
本机范围
。我的问题更多的是针对第二个情节的四个方面。