首页 文章

ggplot条形图中的分组/堆叠因子水平

提问于
浏览
1

我对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()

enter image description here

我会得到一个有三列的条形图 . 但是,我想最终得到两个列,其中一列应该是两个因子级别的堆栈“好”和“有点好”,仍然明显分开 .

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

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

因此,我将其分为三类 . 在大约一半的情况下,我仍然可以使用模式匹配进行过滤,因为我将查看空间的使用 . 然而,另一半正在考虑资本化,这将变得有点混乱,或者至少非常繁琐 .

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

简单地重写因子级别,但这会导致信息丢失(我想保持两个级别分开) . 我想保留原始级别名称,因为我认为我需要它们来绘制堆叠列中的比率并正确标记列 .

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

谢谢!

1 回答

  • 2

    您可以尝试以下方法,以便在分组答案时采用更自动化的方法 .

    我们根据您的数据选择一些关键字并循环显示,以查看哪些答案可能包含每个关键字

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

    enter image description here

相关问题