【问题标题】:Grouping/stacking factor levels in ggplot bar chartggplot条形图中的分组/堆叠因子水平
【发布时间】:2016-08-08 20:25:21
【问题描述】:

我对 R 相对较新,并且是 ggplot 的完整初学者,但我还没有设法找到我所遇到的看似简单的问题的答案。使用 ggplot,我想制作一个条形图,其中堆叠了三个或更多图形因子水平中的两个。

基本上,这是我正在查看的数据类型:

df <- data.frame(Answer=c("good","good","kinda good","kinda good",
  "kinda good","good","bad","good","bad"))

这为我提供了一个具有三个级别的因素,其中两个非常相似:

       Answer
1       good
2       good
3 kinda good
4 kinda good
5 kinda good
6       good
7        bad
8       good
9        bad

如果我现在让 ggplot 为我检查这些数据,

c <- ggplot(df, aes(df$Answer))
c + geom_bar()

我将得到一个包含三列的条形图。但是,我想最终得到两列,其中一列应该是“好”和“有点好”两个因子水平的堆栈,仍然明显分开。

我正在处理 100 列输入(正字法研究),我需要手动完成这些输入,因此我希望尽可能轻松地调整代码。其中一些有十多个级别,我需要将它们分成三列。因此,在大多数情况下,我的数据更可能如下所示:

df <- data.frame(Answer=c("good","goood","goo0d","good",
  "I don't know","Bad","bad","baaad","really bad"))

因此,我将其分为三类。在大约一半的情况下,我可能仍然可以使用模式匹配进行过滤,因为我将研究空格的使用。然而,另一半正在研究大写,这会有点混乱,或者至少非常乏味。

我想了两种不同的方法来更有效地解决这个问题:

只需重写因子级别,但这会导致信息丢失(我希望将两个级别分开)。我想保留原始级别名称,因为我认为我需要它们来绘制该堆叠列内的比率并正确标记该列。

我可以将相应的列/因子拆分为两个单独的列/因子并将它们彼此相邻绘制,从而创建一个“假”的第三维。这看起来是最有前途的方法,但在我处理 100 列数据之前 - 是否有更优雅的方法,可能在 ggplot2 包中,我可以在其中指向/分组级别名称而不是更改/重新排序背后的数据框?

谢谢!

【问题讨论】:

  • ggplot(df, aes(grepl('good', Answer), fill = Answer)) + geom_bar() 会大致了解。基本上它是将组放在 x 上(好或不好)并按Answer 着色
  • 感谢您如此迅速地回复、编辑,当然还有答案!这对两组非常有效!由于您只是将您的答案作为评论发布,我认为如果我需要将十个级别分为三列,可能还有另一种解决方案?
  • 我尽量不鼓励 ggplot :} 将几个组分组为更少不是 ggplot 问题。如果你想创建 n 组,grepl 不会非常有用。如果您发布一些更符合您需要的数据(而不仅仅是两个级别),那将有所帮助
  • 谢谢 - 你会鼓励什么?我添加了一些关于我的数据格式的更多细节。看起来很像我实际上必须改变我的数据架构,而不是告诉 ggplot 从不同的地方提取信息。

标签: r ggplot2


【解决方案1】:

您可以尝试以下方法以更自动化地对答案进行分组。

我们会根据您的数据选择一些关键字并遍历它们以查看哪些答案可能包含每个关键字

groups <- c('good','bad','ugly','know')

df <- data.frame(Answer=c("good","medium good","kinda good","still good",
                          "I don't know","good","bad","good","really bad"))

idx <- sapply(groups, function(x) grepl(x, df$Answer, ignore.case = TRUE))
df$group <- rep(colnames(idx), nrow(idx))[t(idx)]
df

#         Answer group
# 1         good  good
# 2  medium good  good
# 3   kinda good  good
# 4   still good  good
# 5 I don't know  know
# 6         good  good
# 7          bad   bad
# 8         good  good
# 9   really bad   bad


library('ggplot2')
ggplot(df, aes(group, fill = Answer)) + geom_bar()

【讨论】:

  • 谢谢!在彻底经历了这些之后,我终于意识到这正是我所需要的。看起来我们总是需要在 df 中添加一个额外的列,但这种方式可能很好。所以谢谢你的时间和帮助我:)
猜你喜欢
  • 2016-10-29
  • 2022-10-13
  • 2018-04-01
  • 2012-05-11
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2012-07-09
相关资源
最近更新 更多