【问题标题】:Stacked bar plot in R with ratio line overplotR中的堆积条形图与比率线重叠图
【发布时间】:2015-07-28 18:20:57
【问题描述】:

我有每行有一个观察值的数据:

rm(list = ls(all = TRUE))
mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), var2 = sample(c("yes", "no"), 100, replace = TRUE), var3 = sample(c( "yes", "no"), 100, replace = TRUE), var4 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var5 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var6 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE))

我需要:制作一个带有并排条形对的堆叠条形图,每种类型一个条形(好与坏),显示每种类型中有多少个有 0 个“是”变量,有多少个有 1 个“是”变量等,对于所有 6 个变量,最多为“是”。 Y 轴 = 计数,X 轴 = 七个类别(0 是 var,1 是 var 等)。每个条应该是一个堆叠条,颜色编码显示每个 var 对条的总高度的贡献。 NA 被视为“否”。此外,重叠线显示了七个 X 轴类别中每个类别的计数(好)/计数(坏)的比率

【问题讨论】:

  • 请向我们展示您的预期输出,它比情节描述更容易理解。它可以是类似的图表,也可以是您绘制的。

标签: r bar-chart stacked-chart


【解决方案1】:

根据您的描述,这就是我了解您想要实现的目标。它由三个步骤组成:

  1. 将所有 NA 替换为“否”。
  2. 以逐行方式将所有“是”相加。
  3. 实际上是在绘制图表。

所以解决每个点。

假设您的数据如下:

mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), 
                   var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), 
                   var2 = sample(c("yes", "no"), 100, replace = TRUE), 
                   var3 = sample(c( "yes", "no"), 100, replace = TRUE), 
                   var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))

1

用“否”替换所有 NA 只需:

mydf[is.na(mydf)] <- "no"

我们在这里搜索 data.frame 并使用赋值运算符将所有 na 替换为 no。

2

为了以逐行方式添加所有内容,我使用了apply 函数。在 apply 函数中,您可以使用?apply 来确定参数,但简而言之,您(第一个参数)只需指定data.frame,(第二个参数)指定方向,1 表示按行,2 表示列-wise, (3rd arg) 指定你希望应用于方向的函数。

mydf$total.yes <- apply(mydf, 1, function(x) {
  return(length(x[x=="yes"]))
})

3

最后是剧情。制作情节最简单、最美观的方法是使用ggplot。通过键入install.packages("ggplot2") 安装它。对于条形图,我将参考此 [文档](此处:http://docs.ggplot2.org/0.9.3.1/geom_bar.html),否则代码将如下所示。

library(ggplot2)

ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar(position="dodge")

这将产生下面的情节:

我希望这能回答您所寻求的问题。完整代码如下:

mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), 
                   var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), 
                   var2 = sample(c("yes", "no"), 100, replace = TRUE), 
                   var3 = sample(c( "yes", "no"), 100, replace = TRUE), 
                   var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE), 
                   var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))

library(ggplot2)

# replace all NA values to no, this step seems redundant because you're only 
# counting yes's
mydf[is.na(mydf)] <- "no"

# for each row figure out how many "yes" there are...
mydf$total.yes <- apply(mydf, 1, function(x) {
  return(length(x[x=="yes"]))
})

# see example here: http://docs.ggplot2.org/0.9.3.1/geom_bar.html
#using your data


ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar(position="dodge")

geom_bar 实际上是默认堆叠的,(请参阅 [文档](此处:http://docs.ggplot2.org/0.9.3.1/geom_bar.html),如果它被堆叠,它将如下所示:

ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar()

【讨论】:

  • 谢谢,非常接近最终需要的结果。唯一缺少的是堆叠部分,以便查看者可以看到每个变量对图形高度的相对贡献。所以每个条应该由不同颜色的部分组成
  • 抱歉,我不清楚 - 堆叠旨在显示,在每个类别中,哪些变量对条形高度有贡献。所以每个 var 都会有一种颜色(例如 var1=red var2=orange var3=yellow var4=blue var5=green var6=violet)。在 yes = 2 下的图表中,如果“好”的条形总高度为 15,并且在该组中主要是 var3 和 var5 以及少数 var6 为“是”,则条形将具有黄色、绿色和紫色显示这一点的波段,波段厚度与 var3、var5 和 var6(以及任何其他贡献的 var)的频率成正比。我会试着举个例子。
  • 我认为基于 geom_bar 文档的图表应该很容易创建,您只需将数据按摩成您想要的格式。您可能只需将所有信息汇总到适当的级别,并将您的 X 轴作为分组(例如“0 - 好”、“0 - 坏”、“1 - 好”……),然后是你的栏图表将跟随
  • 我有一张在 excel 中手工制作的情节图像,但不知道如何发布。谢谢将尝试处理数据。