如何绘制一系列二分变量和复合变量

时间:2013-07-25 22:51:25

标签: r ggplot2

我想描绘某一特定疾病患者样本的一些临床特征。有四个变量是二分的,如果其中任何一个变为具有攻击性,那么患者被标记为具有攻击性过程。 一次只做一个变量意味着我们可以使用堆积或躲避条形图。我们甚至可以使用饼图。 但是在单个图表上显示所有变量和复合材料更具挑战性。

我创建了一些虚拟数据(只有三个特征+复合)。我无法相信有多少操作我需要通过数据来绘制我想要的内容。我遇到了存在的每一个问题。每个问题都需要更多操纵。当我寻找答案时(例如在stackoverflow上)我找不到任何东西,可能是因为我不知道用什么样的流行语来描述我想要做什么。

问题
1)我正在尝试做什么的热门话题
2)它真的需要这么难吗?或者ggplot2中有更多的直接路由可以让我直接从原始数据文件直接到图表,其中包含与人类主题一样多的行 < / p>

创建了一些模拟数据

require(data.table)
aggr.freq <- sample(c(TRUE, FALSE), size=100, replace=TRUE, prob=c(0.1, 0.9) )
aggr.count <- sample(c(TRUE, FALSE), size=100, replace=TRUE, prob=c(0.2, 0.8) )
aggr.spread <- sample(c(TRUE, FALSE), size=100, replace=TRUE, prob=c(0.4, 0.6) )
human.subjects <- data.table(aggr.freq, aggr.count, aggr.spread)
human.subjects[,aggr.course.composite:=aggr.freq|aggr.count|aggr.spread]

统计了真理

aggr.true  <-  human.subjects [,list(aggr.freq = sum(aggr.freq), aggr.count = sum(aggr.count), aggr.spread = sum(aggr.spread), aggr.course.composite= sum(aggr.course.composite))]

该计数器的绘图方向错误

aggr.true.vertical <- data.table(t(aggr.true))
aggr.true.vertical[,clinical.characteristic:=factor(dimnames(t(aggr.true))[[1]], ordered=TRUE, levels= c("aggr.freq", "aggr.count", "aggr.spread", "aggr.course.composite"))]#have to specify levels otherwise ggplot2 will plot the variables in alphabetical order
setnames(x=aggr.true.vertical, old = "V1", new = "aggressive")
aggr.true.vertical[,indolent:=human.subjects[,.N]-aggressive]#we had the tally of trues now we need to tall the falses


ggplot(aggr.true.vertical, aes(x=clinical.characteristic, y=aggressive)) + geom_bar(stat="identity") # alas, this graph only shows the count of those with an aggressive characteristic and does not give the reader a feel for the proportion.

第二次重塑

require(reshape2)
long <- melt(aggr.true.vertical, variable.name="aggressiveness",value.name="count")
ggplot(long, aes(x=clinical.characteristic, y=count, fill=aggressiveness)) + geom_bar(stat="identity")  

感谢。

1 个答案:

答案 0 :(得分:3)

我想我可以看到你在如何思考这个问题时发生了什么,但我认为你在这个过程的早期“走错了路”。我不确定我是否可以帮助您搜索关键字。无论如何,你需要的只是一个融化然后你可以绘制。数据生成后:

human.subjects$id<-1:nrow(human.subjects) # Create an id variable (which you probably have)
melted.humans<-melt(human.subjects,id='id') 
ggplot(melted.humans, aes(x=variable,fill=value)) + geom_bar()  

enter image description here

也许你宁愿翻转真假的顺序,但你明白了。

此外,您可能对您正在做的其他部分的一些简化代码感兴趣,这些代码正在计算真实和虚假。 (在我的解决方案中,我只是让ggplot去做。)

# Count the trues:
sapply(human.subjects,sum)

# Collect all the trues and falses into a single matrix,
# by running table on each column.
sapply(human.subjects,table)