R中的堆积条形图与比率线叠加图

Stacked bar plot in R with ratio line overplot

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

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 "yes"变量,多少有 1 "yes" 个变量,等等,所有 6 个变量最多 "yes"。 Y 轴 = 计数,X 轴 = 七个类别(0 是变量,1 是变量,等等)。每个条形图应该是一个堆叠条形图,颜色编码显示每个变量对条形图总高度的贡献。 NA 被视为 "no"。此外,覆盖线显示了七个 X 轴类别中每个类别的计数(好)/计数(坏)的比率

根据您的描述,我了解到您要实现的目标如下。它包括三个步骤:

  1. 将所有 NA 替换为 "no"。
  2. 将所有 "yes" 按行相加。
  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 替换为 "no" 只需:

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

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

2

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

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