【问题标题】:Graph proportion within a factor level rather than a count in ggplot2图形比例在因子水平而不是 ggplot2 中的计数
【发布时间】:2019-08-09 09:23:06
【问题描述】:

我有两个具有多个级别的分类变量。每个变量内的水平有不同数量的观察,例如:

var1 <- c("Left", "Right", NA, "Left", "Right", "Right", "Right", "Left", "Left", "Right", "Left", "Left","Left", "Right", "Left", "Right", "Right", "Right", "Left", "Left", "Right", NA, "Left", "Left","Left", "Right", NA, "Left", "Right", "Right", "Right", "Left", "Left", "Right", "Left", "Left","Left", "Right", "Left", "Right", "Right", "Right", "Left", "Left", "Right", NA, "Left", "Left")
var2 <- c("Higher", "Lower", NA, "Slightly higher", "Slightly higher", "Slightly higher", "Lower", "Slightly higher", "Higher", "Higher", "Higher", "Slightly higher","Higher", "Lower", "Slightly higher", "Slightly higher", "Slightly higher", "Lower", "Slightly higher", "Higher", "Higher", "Higher", NA, "Slightly lower","Higher", "Lower", NA, "Slightly higher", "Slightly higher", "Slightly higher", "Lower", "Slightly higher", "Higher", "Higher", "Higher", "Slightly higher","Higher", "Lower", "Slightly higher", "Slightly higher", "Slightly higher", "Lower", "Slightly lower", "Higher", "Higher", "Higher", NA, "Slightly lower")
df <- as.data.frame(cbind(var1, var2))

我想创建一个图表来绘制选择每个级别 var2 的 var1 的每个类别的比例。因此,例如在这里,选择“更高”答案的“左”组的比例(选择“更高”的左的人数除以“左”的总人数),旁边是“右”的选择“更高”答案的比例(选择较高的正确人数除以正确人数)依次为每个答案。

我已经编写了下面的 ggplot 代码,它为我提供了一个并排显示每个答案选项的每组计数的图表,但它没有给我比例,因此左右两组不具有可比性(因为每个组的人数不同。如果可能的话,我还想为左右每个组指定特定的颜色......

Plot<-ggplot(df, aes(var2))+ 
  geom_bar( aes(fill=var1),position = "dodge")+ 
  labs(x="Left or Right",y="Count")+
  scale_y_continuous()) +
  scale_fill_discrete(name = "Answer:")+ theme_classic()+ theme(legend.position="top")

我对这段代码的第二个问题是我得到了代码中 NA 值的因子水平。我知道我可以在我的 ggplot 代码中在 df 上使用 na.omit,它适用于这个小数据框,但我的真实数据集有多个列,如果你运行 na.omit,它会删除所有包含 NA 的列中的所有行,其中是数百行数据,我不想这样做!有没有办法从 ggplot 代码中的数据框中的特定变量中删除 NA?

如果有人有任何想法,那就太好了。提前非常感谢您!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我们可以计算每组的比例,然后绘制。您也可以使用scale_fill_manual手动指定颜色

    library(dplyr)
    library(ggplot2)
    
    df %>%
      na.omit() %>%
      group_by(var1, var2) %>%
      summarise(n = n()) %>%
      mutate(n = n/sum(n)) %>%
      ungroup() %>%
      ggplot() + aes(var2, n, fill = var1) + 
      geom_bar(position = "dodge", stat = "identity") + 
      labs(x="Left or Right",y="Count")+
      scale_y_continuous() +
      scale_fill_discrete(name = "Answer:")+ theme_classic()+ 
      theme(legend.position="top")  +
      scale_fill_manual(values = c("black", "red"))
    

    这里我删除了所有带有NA 的行。如果您只想对特定列执行此操作,您可以使用 filteris.na 来删除这些值。因此,例如,要仅从 var1 中删除 NA 值,我们可以这样做

    df %>%
      filter(!is.na(var1)) 
      group_by(var1, var2) %>% .....
    

    【讨论】:

    • 您好 Ronak,我不确定您是否仍会收到有关此帖子的通知,但以防万一,您能否建议我如何将误差条显示在每个条中的比例上?非常感谢!
    • 谢谢!我一直对这两个帖子感到困惑 - 我正在尝试计算比例的 95% 置信区间,并将其集成到您的代码中,但我不知道如何计算。我尝试添加代码: upperE=(1.96*sqrt(n/sum(n))*(1-(n/sum(n)))/n), lowerE=(-1.96*sqrt(n/ sum(n))*(1-(n/sum(n)))/n) 进入你的代码部分,你取消分组数据,但我不断收到错误......你对如何编辑有任何想法它?再次感谢您!
    • 也许我应该在一个新问题中提出这个问题,这可能更容易:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2012-06-12
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多