【问题标题】:creating bar graphs from multiple columns从多列创建条形图
【发布时间】:2014-09-08 18:38:45
【问题描述】:

我有以下数据集:

Location    Type    FromDate    ToDate  1   2   3   4   5
  A          1        12-Jul    13-Jul  2   4   0   1   2
  A          2        12-Jul    13-Jul  0   0   1   4   1
  B          1        12-Jul    13-Jul  0   1   1   3   1
  B          2        12-Jul    13-Jul  1   0   0   0   1
  C          1        12-Jul    13-Jul  2   3   1   5   0
  C          2        12-Jul    13-Jul  3   3   1   0   0

如何在 R 中为每个位置(包括类型 1 和类型 2)在第 1 天到第 5 天创建条形图?

【问题讨论】:

    标签: mysql sql r plot


    【解决方案1】:

    一个稍微替代的解决方案,而不是使用reshape2plyr 使用dplyrtidyr。后一种组合利用了越来越流行的管道。

    先读取数据:

    df <- read.table(header=TRUE, text="Location    Type    FromDate   ToDate 1   2   3   4   5
    A          1        12-Jul    13-Jul  2   4   0   1   2
    A          2        12-Jul    13-Jul  0   0   1   4   1
    B          1        12-Jul    13-Jul  0   1   1   3   1
    B          2        12-Jul    13-Jul  1   0   0   0   1
    C          1        12-Jul    13-Jul  2   3   1   5   0
    C          2        12-Jul    13-Jul  3   3   1   0   0")
    # remove the X-es which are put in front of the days
    names(df) <- gsub("X","",names(df))
    

    加载所需的库:

    library(dplyr)
    library(tidyr)
    library(ggplot2)
    

    将数据从宽格式融合到长格式:

    df.m <- df %>% gather(day,value,5:9)
    

    创建情节:

    ggplot(data=df.m, aes(x=day, y=value, fill=as.factor(Type))) + 
      geom_bar(stat="identity", position="dodge") + 
      xlab("Day of the week") +
      scale_fill_discrete("Type\nof\nsomething\n") +
      facet_grid(Location ~ ., labeller=label_both) +
      theme_bw() +
      theme(axis.title.y=element_blank())
    

    导致:


    但是,考虑到您的数据,折线图可能是更好的可视化效果:

    ggplot(data=df.m, aes(x=day, y=value, color=as.factor(Type), group=as.factor(Type))) + 
      geom_line(size=1.5) + 
      xlab("Days") +
      scale_color_discrete("Type\nof\nsomething\n") +
      facet_grid(Location ~ ., labeller=label_both) +
      theme_bw() +
      theme(axis.title.y=element_blank())
    

    导致:

    【讨论】:

    • tidyr 包和它的gather 函数对我来说是新闻,但它似乎工作得非常优雅。感谢您的意见!
    • 我无法在我的 R Studio 上安装 'tidyr' 包。我的 R 有什么问题还是我应该使用任何特定的命令?
    • 奇怪,因为tidyr is available on CRAN。你用的是什么版本的R?或者,您也可以从 Github (installation instructions) 安装“tidyr”
    【解决方案2】:

    您应该更准确地澄清您的问题,以便读者确切地知道您想要什么。还希望您通过解释您已经尝试过的方法来展示解决问题的努力。

    因此,我只能猜测您想要什么,这是我的建议:

    加载所需的包:

    require(ggplot2)
    require(reshape2)
    require(plyr)
    

    重新创建你的 df:

    location = c('A','A','B','B','C','C')
    type = rep(c(1,2),3)
    fdate = rep('12-Jul', 6)
    tdate = rep('13-Jul', 6)
    v1 = c(2,0,0,1,2,3)
    v2 = c(4,0,1,0,3,3)
    v3 = c(0,1,1,0,1,1)
    v4 = c(1,4,3,0,5,0)
    v5 = c(2,1,1,1,0,0)
    
    dat = data.frame(location, type, fdate, tdate, v1, v2, v3, v4, v5)
    

    重新排列数据以进行绘图:

    melted = melt(dat, id.vars=c('location', 'type', 'fdate', 'tdate'))
    sums = ddply(melted, c('fdate', 'tdate', 'location', 'type', 'variable'), 
    summarise, sum=sum(value))
    

    用 ggplot2 绘图:

    ggplot(aes(x=variable, y=sum, fill=as.factor(type)), data=sums) + 
        geom_bar(stat="identity", position="dodge") + 
        facet_grid(location ~ .)
    

    edit:使用您发布的确切数据框:

    # read data
    dat2 <- read.table(header=T, text="Location    Type    FromDate   ToDate 1   2   3   4   5
    A          1        12-Jul    13-Jul  2   4   0   1   2
    A          2        12-Jul    13-Jul  0   0   1   4   1
    B          1        12-Jul    13-Jul  0   1   1   3   1
    B          2        12-Jul    13-Jul  1   0   0   0   1
    C          1        12-Jul    13-Jul  2   3   1   5   0
    C          2        12-Jul    13-Jul  3   3   1   0   0")
    
    # rearranging data for plotting
    melted = melt(dat2, id.vars=c('Location', 'Type', 'FromDate', 'ToDate'))
    sums = ddply(melted, c('FromDate', 'ToDate', 'Location', 'Type', 'variable'),
    summarise, sum=sum(value))
    # plot with ggplot2
    ggplot(aes(x=variable, y=sum, fill=as.factor(Type)), data=sums) + 
       geom_bar(stat="identity", position="dodge") + 
       facet_grid(Location ~ .)
    

    【讨论】:

    • 我之前运行过你的代码,但今天当我想再次运行时,我收到了这个错误:在 sums 函数之后出现“invalid 'type' (character) of argument”。我在您的代码中唯一更改的是,在 dat 中,我用表 [1:6,5:9] 替换了 v1、v2、...(表是我的文件名)。
    • 您可能需要调整ddply 和以下ggplot 函数中的变量名称。我将编辑我的答案并添加与您发布的原始表格一起使用的代码,而不是与我重新创建的表格一起使用。
    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2015-05-08
    相关资源
    最近更新 更多