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 轴类别中每个类别的计数(好)/计数(坏)的比率
根据您的描述,我了解到您要实现的目标如下。它包括三个步骤:
- 将所有 NA 替换为 "no"。
- 将所有 "yes" 按行相加。
- 实际绘制图形。
所以解决每个问题。
假设您的数据如下:
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()
我的数据每行有一个观察值:
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 轴类别中每个类别的计数(好)/计数(坏)的比率
根据您的描述,我了解到您要实现的目标如下。它包括三个步骤:
- 将所有 NA 替换为 "no"。
- 将所有 "yes" 按行相加。
- 实际绘制图形。
所以解决每个问题。
假设您的数据如下:
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()