根据ggplot中的两个条件对条形图进行排序

Posted

技术标签:

【中文标题】根据ggplot中的两个条件对条形图进行排序【英文标题】:Sort a bar plot based on two conditions in ggplot 【发布时间】:2021-09-03 03:41:20 【问题描述】:

我想创建一个条形图,按 排列,并在这些组内按 *最小值到最大值 值排序。

为了重新创建示例,我将使用以下数据框

df <- data.frame(
  stringsAsFactors = FALSE,
             Sites = c("Site 1","Site 2","Site 3",
                       "Site 4","Site 5","Site 6","Site 7","Site 8","Site 9",
                       "Site 10","Site 11"),
            Values = c(184.7955548,171.1466314,
                       245.5952181,188.3072784,259.9438698,210.3448318,
                       173.7977541,182.5497301,198.7985429,188.0458496,215.5709303),
            Groups = c(1, 1, 3, 3, 2, 3, 1, 3, 3, 2, 2))

对于我使用的情节:

df %>% arrange(Groups, Values) %>%
  mutate(name=factor(Groups, levels = Values)) %>%
  ggplot(aes(x = df$Sites, y = df$Values))+
  geom_bar(stat = "identity", fill = df$Groups)+
  scale_color_manual(values = c ('royalblue1', 'slategrey2', 'yellow1'))+
  ylab("Values")+
  xlab("")+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

导致:

但我期待的是以下内容:

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

代码中的几个问题 -

name=factor(Groups, levels = Values) 提供所有 NA 的。 levels 应该是数据中存在的值。 在ggplot 代码中我们不需要$df$Sites 也没有我们需要的因子水平。因子水平被添加到管道数据中,而不是原始数据中。
library(dplyr)
library(ggplot2)

df %>% 
    arrange(Groups, Values) %>%
    mutate(Sites=factor(Sites, levels = Sites), 
           Groups = factor(Groups)) %>% 
    ggplot(aes(x = Sites, y = Values, fill = Groups)) +
    geom_bar(stat = "identity")+
    scale_fill_manual(values = c ('royalblue1', 'grey2', 'yellow1'))+
    ylab("Values")+
    xlab("")+
    theme(axis.text.x = element_text(angle = 90, hjust = 1))

【讨论】:

对不起,我没有注意到。我们需要使用scale_fill_manual。更新了答案。

以上是关于根据ggplot中的两个条件对条形图进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R ggplot 按值对条形图进行排序? [复制]

带有ggplot2的发散堆积条形图:图例中的因子排序问题

按“填充”变量ggplot中的值排序 - 条形图R

如何根据分面包装中的 2 个组中的 1 个对条形图进行排序?

ggplot 条形图,具有与方面相关的类别顺序

仅使用一个变量(无值或排名)对 ggplot2 条形图中的条形重新排序?