如何在ggplot中按比例重新排列因子?

时间:2019-03-12 11:35:28

标签: r ggplot2 dplyr

我的问题是我想对使用geom_bar(position = "fill"生成的ggplot输出中的因子进行重新排序,以使正类的最高比例最接近y轴。我设法找到了一个可行的解决方案,但从我的研究看来,似乎有一个更有效的解决方案潜伏,尽管我似乎找不到。

我已经阅读了问题Order Bars in ggplot2 bar graph,但似乎找不到按比例排序的解决方案,即按数据框中未明确显示的值进行汇总,而是一种汇总状态。

我看过Modifying Factor Order section of the book, R for Data Science,并提出了一种解决方案,其中使用“ prop”列生成摘要数据帧,并使用fct_reorder2()根据这些值创建折线图。但是,我似乎无法对“填充”条形图应用类似的逻辑。

我最终遇到的解决方案来自此来源#267 REORDER A VARIABLE IN GGPLOT2,您只需使用mutate()设置新的因子水平。但是,我创建了一个数据框,而不是自己定义顺序,而是按正类的比例对因子进行排序。

我想知道的是,是否有一种更有效的方法(也许是在长管道操作中)?

这是一个可重复的示例:

library(ggplot2)
library(dplyr)

variable <- c(rep("alpha", 4),
              rep("beta", 4),
              rep("gamma", 4),
              rep("delta", 4))

class <- c(rep("1", 4),
           "1", "1", "0", "0",
           rep("0", 3), "1",
           rep("1", 3), "0")

dframe <- data.frame(variable, class)

plot_order <- dframe %>%
  count(variable, class) %>%
  group_by(variable) %>%
  mutate(prop = prop.table(n)) %>%
  filter(class == "1") %>%
  arrange(prop)

lvls <- as.character(plot_order$variable)

dframe %>%
  mutate(variable = factor(variable, levels = lvls)) %>%
  ggplot(aes(x = variable, fill = class)) +
  geom_bar(position ="fill") +
  labs(y = "Proportion")

这是plot_order的输出:

# A tibble: 4 x 4
# Groups:   variable [4]
  variable class     n  prop
  <fct>    <fct> <int> <dbl>
1 alpha    1         4  1   
2 delta    1         3  0.75
3 beta     1         2  0.5 
4 gamma    1         1  0.25

结果:

条形图,其基于位置“填充”的有序因子

Bar graph with ordered factors based on position "fill"

谢谢。

0 个答案:

没有答案