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

这是一些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是否可以成功...功能。但我不知道如何使用...

    最佳答案

    首先,您需要获取每个类别的计数,即每个组(食物,音乐,人)有多少坏货等等。可以这样做:

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

    关于r - ggplot中的分组条形图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18158461/

    10-12 17:06