【问题标题】:How to plot multiple response survey items in R using ggplot2?如何使用 ggplot2 在 R 中绘制多个响应调查项目?
【发布时间】:2019-09-13 08:47:57
【问题描述】:

我将调查数据结构化为几个项目变量,这些变量表示调查受访者是否提到 (1) 或未提及 (2)。所以简而言之,每一行都是针对不同的调查受访者,他们可以选择 a 到 c 的所有选项(如下面数据中第三个受访者的情况),或者不选择或只选择一些。

假设这是数据集:

testdat<-data.frame(option_a=c(1,2,2,1,2),
                    option_b=c(1,1,2,1,2),
                    option_c=c(1,1,2,1,1))

绘制任何选项的相对频率的最简单和最快的方法是什么?结果应该是一个 geom_bar 图,其中三个条表示不同的选项(a:40%,b:60%,c:20%)。换句话说,我想有一个情节,我可以说,在 x% 的案例中,受访者选择了一个给定的选项。

有没有一种方法可以直接在 ggplot 中执行此操作,而无需重组数据集或将 2s 替换为 0s 等?我想这应该很容易,但我现在看不到。

【问题讨论】:

    标签: r ggplot2 survey


    【解决方案1】:

    对于条形图,您需要将数据转换为长格式。您不能在 ggplot 函数本身内执行此操作。您可以更改 ggplot 内的值的级别,但您还需要重命名 fill 图例。

    testdat<-data.frame(option_a=c(1,2,2,1,2),
                        option_b=c(1,1,2,1,2),
                        option_c=c(1,1,2,1,1))
    
    require(ggplot2)
    require(tidyverse)
    
    testdat %>%
      gather(option,value) %>%
      ggplot(aes(x = factor(option), fill = factor((value-2)*-1))) +
      geom_bar()
    

    要获得百分比/比例而不是n,您可以在绘制数据之前汇总数据,如下所示:

    testdat %>%
      gather(option, value) %>%
      group_by(option,value) %>%
      summarise(n = n()) %>%
      group_by(option) %>%
      mutate(percentage = n/sum(n)*100) %>%
      ggplot(aes(x = factor(option), y = percentage, fill = factor((value-2)*-1))) +
      geom_bar(stat = "identity")
    

    编辑:

    只显示其中一个选项的相对频率:

    testdat %>%
      gather(option, value) %>%
      group_by(option,value) %>%
      summarise(n = n()) %>%
      group_by(option) %>%
      mutate(percentage = n/sum(n)*100) %>%
      filter(value == 1) %>%
      ggplot(aes(x = factor(option), y = percentage, fill = factor((value-2)*-1))) +
      geom_bar(stat = "identity")
    

    【讨论】:

    • 这种情况下不需要在ggplot之外计算比例。您可以使用geom_bar(aes(y = stat(count/sum(count))), position = position_fill())geom_bar(aes(y = ..count../sum(..count..)), position = position_fill())(取决于您的ggplots 版本)
    • 好的,谢谢,我认为可以直接在 ggplot 中执行此操作,但我需要重组数据。你知道为什么我不能只指定y=(..count..)/sum(..count..) 来获取我的相对频率吗?即使我将度量变量重新编码为 {1,0} 二进制变量,这也不起作用。
    • @kath:谢谢。但是由于某种原因, *100 似乎不起作用。我仍然得到 0-1 的 y 值,而不是 0% 到 100%。
    • @FabianHabersack 使用 scale_y_continuous(labels = scales::percent) 很好地格式化 y 轴
    • 对,行得通。最后一个问题:我如何摆脱堆积的条形图,只绘制这些选项实际提及的相对频率(即只有1,而不是2)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多