【问题标题】:Grouped bar plot in ggplotggplot中的分组条形图
【发布时间】:2013-08-12 01:55:59
【问题描述】:

我有一个调查文件,其中行是观察和列问题。

这里有一些fake data,它们看起来像:

People,Food,Music,People
P1,Very Bad,Bad,Good
P2,Good,Good,Very Bad
P3,Good,Bad,Good
P4,Good,Very Bad,Very Good
P5,Bad,Good,Very Good
P6,Bad,Good,Very Good

我的目标是用ggplot2 创造这种情节。

  • 我绝对 不在乎颜色、设计等。
  • 情节与假数据不符

这是我的假数据:

raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

但是如果我选择 Y 作为计数,那么我将面临选择 X 和 Group 值的问题...我不知道不使用 reshape2 是否可以成功...我也累了使用带有融化功能的重塑。但是我不明白如何使用它......

【问题讨论】:

    标签: r ggplot2 bar-chart reshape reshape2


    【解决方案1】:

    编辑:八年后......

    这需要一个 tidyverse 解决方案,所以这里有一个,所有非基础包都明确说明,以便您知道每个函数的来源(read.csv 来自utils,基础 R 附带):

    library(magrittr) # needed for %>% if dplyr is not attached
    
    "http://pastebin.com/raw.php?i=L8cEKcxS" %>%
      read.csv(sep = ",") %>%
      tidyr::pivot_longer(cols = c(Food, Music, People.1),
                          names_to = "variable",
                          values_to = "value") %>%
      dplyr::group_by(variable, value) %>%
      dplyr::summarise(n = dplyr::n()) %>%
      dplyr::mutate(value = factor(
        value,
        levels = c("Very Bad", "Bad", "Good", "Very Good"))
      ) %>%
      ggplot2::ggplot(ggplot2::aes(variable, n)) +
      ggplot2::geom_bar(ggplot2::aes(fill = value),
                        position = "dodge",
                        stat = "identity")
    

    原答案:

    首先,您需要获取每个类别的计数,即每个组(食物、音乐、人)有多少坏和商品等。这将像这样完成:

    raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
    raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
    raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
    raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
    
    raw=raw[,c(2,3,4)] # getting rid of the "people" variable as I see no use for it
    
    freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level
    

    然后你需要用它创建一个数据框,融化它并绘制它:

    Names=c("Food","Music","People")     # create list of names
    data=data.frame(cbind(freq),Names)   # combine them into a data frame
    data=data[,c(5,3,1,2,4)]             # sort columns
    
    # melt the data frame for plotting
    data.m <- melt(data, id.vars='Names')
    
    # plot everything
    ggplot(data.m, aes(Names, value)) +   
      geom_bar(aes(fill = variable), position = "dodge", stat="identity")
    

    这就是你所追求的吗?

    澄清一下,在ggplot multiple grouping bar 中,您有一个如下所示的数据框:

    > head(df)
      ID Type Annee X1PCE X2PCE X3PCE X4PCE X5PCE X6PCE
    1  1    A  1980   450   338   154    36    13     9
    2  2    A  2000   288   407   212    54    16    23
    3  3    A  2020   196   434   246    68    19    36
    4  4    B  1980   111   326   441    90    21    11
    5  5    B  2000    63   298   443   133    42    21
    6  6    B  2020    36   257   462   162    55    30
    

    由于您在 4-9 列中有数值,稍后将在 y 轴上绘制,因此可以使用 reshape 轻松转换并绘制。

    对于我们当前的数据集,我们需要类似的东西,所以我们使用freq=table(col(raw), as.matrix(raw)) 来得到这个:

    > data
       Names Very.Bad Bad Good Very.Good
    1   Food        7   6    5         2
    2  Music        5   5    7         3
    3 People        6   3    7         4
    

    想象一下你有Very.BadBadGood等等而不是X1PCEX2PCEX3PCE。看到相似之处了吗?但我们需要先创建这样的结构。因此freq=table(col(raw), as.matrix(raw))

    【讨论】:

    • 你好谢谢你正是我想要的。谢谢。我只是有一个问题,是否也可以避免'raw=raw[,c(2,3,4)] freq=table(col(raw), as.matrix(raw)) 并通过重塑来做所有事情?因为我遇到了同样的问题stackoverflow.com/questions/17303573/…,在这篇文章中我只使用了 reshape。我对此感到困惑......
    • 好吧,我不确定。 raw=raw[,c(2,3,4)] 存在只是因为包含观察指标没有意义(因为您不会在后续图中绘制单个观察值)。因此,计数是唯一重要的事情。我不知道您是否可以使用reshape 完成所有操作。我的猜测是你不能。
    • 嗯,实际上,当前帖子中的数据不同之处在于它不包含数字计数。查看您链接到的帖子中数据框中的第 4-9 列:它们包含数值,随后由 Didzis 融化以在融化的数据框中创建 value 变量。我们没有任何值,所以我们需要先创建它们。因此freq=table(col(raw), as.matrix(raw))。 (我在答案末尾添加了更广泛的解释)。
    • 是的。我得到了它。谢谢 基本上像这篇文章中的分类数据还有一个步骤......感谢您的非常好的解释。
    • 很抱歉再次打扰,我还有一个问题,您知道是否可以在每个条形上显示频率(或百分比)?
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多