首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中带比值线超图的叠加条形图

R中带比值线超图的叠加条形图
EN

Stack Overflow用户
提问于 2015-05-17 03:12:25
回答 1查看 1.1K关注 0票数 0

我有每一行一次观测的数据:

代码语言:javascript
复制
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“是”var,有多少有1 "yes“var等等,对于所有6 var,最多显示”是“。Y轴=计数,X轴=七类(0是vars,1 yes var,等等).每个条形应该是一个堆叠的条形图,颜色编码显示每个变量对条形图的总高度的贡献。NAs被视为“否”。此外,超图线显示七个X轴类别中每个类别的计数比(很好)/count(坏)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-17 04:34:52

根据你的描述,这是我理解你想要达到的目标。它由三个步骤组成:

  1. 用“不”代替所有的NA。
  2. 用一种连续的方式把所有的“是”加起来。
  3. 实际上是在绘制图表。

所以要解决每一个问题。

让我们假设您的数据如下:

代码语言:javascript
复制
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“就是:

代码语言:javascript
复制
mydf[is.na(mydf)] <- "no"

在这里,我们通过data.frame搜索,并使用赋值操作符将所有的na替换为no。

2

为了以逐行方式添加所有内容,我使用了apply函数。在apply函数中,您可以使用?apply来确定参数,但简单地说,您(第1 arg)只指定data.frame,(第2 arg)指定方向,1指定行方向,2指定列方向,(第3 arg)指定要应用于方向的函数。

代码语言:javascript
复制
mydf$total.yes <- apply(mydf, 1, function(x) {
  return(length(x[x=="yes"]))
})

3

最后是情节。制作情节最简单、最美观的方法是使用ggplot。通过键入install.packages("ggplot2")安装它。对于条形图,我将引用这个documentation,否则代码将如下所示。

代码语言:javascript
复制
library(ggplot2)

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

这将产生下面的情节:

我希望这能回答你想要的问题。完整的代码如下:

代码语言:javascript
复制
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是堆叠的(参见documentation,如果它是堆叠的,则如下所示:

代码语言:javascript
复制
ggplot(mydf, aes(total.yes, fill=kind)) +
  geom_bar()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30282990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档