【问题标题】:How to reorder the stacked segments of a bar chart using ggplot [duplicate]如何使用ggplot重新排序条形图的堆叠段[重复]
【发布时间】:2021-11-22 04:41:57
【问题描述】:

我正在使用 ggplot 创建分类条形图,但我需要更改堆叠段的布局。这是我创建情节的代码:

ggplot(full_genus_new, aes(x=as.factor(Var2), y=value, fill=Var1)) +
    geom_bar(stat="identity", position = "fill", aes(order = -value)) +
    scale_x_discrete() +
    ylab("Relative Microbial Activity") +
    facet_grid(cols=vars(PEDIS), scales = "free_x", space = "free_x") +
    theme_classic() +
    scale_fill_manual(values = Cb64k) +
    scale_y_continuous(labels=percent_format()) +
    theme(legend.position = "bottom", legend.text = element_text(size=8)) +
    guides(fill=guide_legend(title="Taxa")) +
    xlab("Patient") +
    theme(legend.key.size = unit(0.5,'cm'))

这会产生以下内容:

如何使“其他”组位于堆栈底部而不是中间,以使图像看起来更干净?

这就是我正在使用的数据框的外观,它是一个高大的结构,Var2 是患者:

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    fill=factor(Var1, levels = c(setdiff(Var1, "Other"), "Other"))代替fill=Var1

    这是一个使用palmerpenguins dataset的例子:

    library(tidyverse)
    library(palmerpenguins)
    
    penguins %>%
      na.omit() %>%
      ggplot(aes(x=as.factor(species), y=body_mass_g, fill=factor(year))) +
      geom_bar(stat="identity", position = "fill")
    

    penguins %>%
      na.omit() %>%
      ggplot(aes(x=as.factor(species), y=body_mass_g, fill=factor(year, levels = c(setdiff(year, 2008), 2008)))) +
      geom_bar(stat="identity", position = "fill") +
      labs(fill = "Year")
    

    reprex package (v2.0.1) 于 2021 年 11 月 22 日创建

    【讨论】:

    • 我会试一试的。或者,有没有办法可以订购堆栈,使它们的尺寸减小或增大?而不是混淆?
    • 您好,这有效,“其他”部分出现在图的底部,就像您的示例中的 2008 一样。有没有办法让我可以翻转它,以便“其他”段位于堆栈的顶部?
    • 是的,要将“其他”放在开头,请使用fill=factor(Var1, levels = c("Other", setdiff(Var1, "Other"))) 而不是fill=factor(Var1, levels = c(setdiff(Var1, "Other"), "Other"))
    • 成功了,非常感谢!
    • 不客气@mrad。出于兴趣,stackoverflow.com/questions/32345923/… 的答案是否解决了您的问题?还是很难根据您的情况翻译答案?
    【解决方案2】:

    我不确定Var1 是否是一个因素。将您的数据作为图片发布是不合适的。

    如果是因素,我们将xy定义为

    x <- levels(full_genus_new$Var1)
    y <- c(x[x!= "Other"], "Other")
    

    那么在ggplot部分的第一部分,试试

    ggplot(full_genus_new, aes(x=as.factor(Var2), y=value, fill= factor(Var1, levels = y))) +...
    

    【讨论】:

    • 您好,应该是“!”点在第二行代码中?我收到了一个错误,包括它。在没有“!”的情况下运行它然后尝试按照您的建议进行绘制,我收到此错误: aes(x = as.factor(Var2), y = value, fill = factor(Var1, levels = y)) + 中的错误:二进制运算符的非数字参数
    【解决方案3】:

    您可以使用 mutate 和 factor 参数为观察创建级别(层次结构)。目前,堆积条形图按字母顺序排列观察结果(因此“其他”出现在中间某处)。如果您创建层次结构以使“其他”出现在末尾,那么您可以让它出现在图表的底部。

    这是一个例子。您会看到第一个图将在“X”之前显示“其他”比例。第二个,分解/重新排序的,最后会显示“Other”。

    library(tidyverse)
    
    df <- tibble(
      category1 = c("One"),
      category2 = c("A", "B", "C", "Other", "X"),
      proportion = c(20, 20,40,10, 10)
    )
    
    df %>% 
      ggplot(., aes(x = category1, y = proportion, fill = category2)) +
      geom_bar(stat="identity")
    
    df %>% 
      mutate(category_reordered = factor(category2, levels = c("A", "B", "C", "X", "Other"))) %>% 
      ggplot(., aes(x = category1, y = proportion, fill = category_reordered)) +
      geom_bar(stat="identity")
    

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2014-07-07
      相关资源
      最近更新 更多