【问题标题】:How to use ggplot for multiple rows into one plot-graphic如何将 ggplot 用于一个绘图图形中的多行
【发布时间】:2020-12-04 13:46:28
【问题描述】:

说实话,我认为对于 R 专家来说这是一个愚蠢而简单的问题。 但是,我已经遇到这个问题好几个小时了,还没有真正想出解决方案......

我有来自一项调查的数据,该调查询问某人是否已经使用过语音助手(1 = 使用,2 = 未使用;因素)以及他们希望如何与系统通信(1 = 会使用,0 = 会不使用;数字)。由于沟通问题可以有多种选择,因此我将答案分成单独的列。

#row Assistant Touchdisplay Mobile Voice
   1         1            0      1     1
   2         2            1      0     0
   3         1            1      1     1
   4         1            1      0     1     

现在我想展示一下已经使用语音助手和未使用语音助手的人是如何回答的。

我试过了:

ggplot(data) + geom_bar(aes(Touchdisplay==1, , fill = Assistent), position = "dodge")

这几乎就是我所需要的。但只有右侧 (TRUE),不仅适用于触摸屏,而且适用于一个绘图图形中的所有其他方法。

我确信对于 R 专家来说这很容易,我已经尝试了所有我能想到的方法,但我目前缺少解决它的起点......

【问题讨论】:

    标签: r ggplot2 statistics


    【解决方案1】:

    我想你可能正在寻找这个?通常情况下,您需要先重塑数据:

    data %>% 
      pivot_longer(cols = -Assistant) %>% 
      filter(value != 0) %>% 
      ggplot(aes(x = name, fill = factor(Assistant))) +
      geom_bar(position = position_dodge(preserve = 'single'))
    

    【讨论】:

      【解决方案2】:

      我建议这样做:

      library(tidyverse)
      #Data
      data <- structure(list(Assistant = c(1L, 2L, 1L, 1L), Touchdisplay = c(0L, 
      1L, 1L, 1L), Mobile = c(1L, 0L, 1L, 0L), Voice = c(1L, 0L, 1L, 
      1L)), row.names = c(NA, -4L), class = "data.frame")
      

      代码:

      data %>% pivot_longer(cols = -Assistant) %>% filter(value!=0) %>%
        group_by(Assistant,name) %>% summarise(val=sum(value)) %>%
        filter(name=='Touchdisplay') %>%
        ggplot()+
        geom_bar(stat = 'identity',aes(x=name,y=val,fill=factor(Assistant)),position=position_dodge())
      

      输出:

      这样您还可以添加其他设备更改代码filter(name=='Touchdisplay')

      data %>% pivot_longer(cols = -Assistant) %>% filter(value!=0) %>%
        group_by(Assistant,name) %>% summarise(val=sum(value)) %>%
        ggplot()+
        geom_bar(stat = 'identity',aes(x=name,y=val,fill=factor(Assistant)),position=position_dodge())
      

      输出:

      【讨论】:

        【解决方案3】:

        我认为 OP 只想在过滤 Assistant==1 后为每个类别绘制 1,所以也许这就是你想要的?

        首先,一些数据:

        set.seed(22447)
        data <- data.frame(Assistant=factor(sample(1:2, size=100, replace=T)), 
                           Touchdisplay=sample(0:1, size=100, replace=T),
                           Mobile=sample(0:1, size=100, replace=T), 
                           Voice=sample(0:1, size=100, replace=T))
        

        这是使用此示例数据的原始图的样子:

        ggplot(data) + geom_bar(aes(Touchdisplay==1, fill = Assistant), 
                                position = "dodge")
        

        现在进行过滤、转向更长的时间和总结:

        ds <- data %>% filter(Assistant==1) %>% pivot_longer(-Assistant) %>% 
          group_by(name) %>% summarize(total=sum(value))
        
        ds
        

        summary 的输出:

                # A tibble: 3 x 2
              name         total
              <chr>        <int>
            1 Mobile          26
            2 Touchdisplay    26
            3 Voice           19
        

        使用 geom_col() 绘制 1:

        ggplot(ds) + geom_col(aes(name, total))
        

        【讨论】:

          猜你喜欢
          • 2021-04-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-30
          • 2023-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-18
          相关资源
          最近更新 更多