2012-09-23 93 views
1

我是新来的R和我想知道如何生成以下情况柱状图:生成“二维”直方图中的R

我开始有规则的频率表2列:A列是类别(或槽)和列B是落入该类别

Col A Col B 
1-10  7 
11-20  4 
21-30  5 

从该初始频率表病例数,创建与3列的表格:柱A再次是类别(或槽),但是现在列B是“总案例的分数”,因此对于1-10类,列B将具有值7 /(7 + 4 + 5)= 7/16。现在还有第三列Col C,它是“类别1-20之间的总案例的一部分”,因此对于1-10,Col C的值将是7 /(7 + 4)= 7/11 。完整的表格如下所示:

Col A Col B Col C 
1-10  7/16  7/11 
11-20  4/16  4/11 
21-30  5/16  0 

如何从上面的3列表中生成直方图?我的X轴应该是bin(1-10,11-20等),我的Y轴应该是分数,但是对于每个bin我有两个分数(Col B和Col C),所以会有两个分数“酒吧“直方图中的每个bin。

任何帮助将不胜感激。

回答

2

数据:

dat <- data.frame(A = c("1-10", "11-20", "21-30"), B = c(7, 4, 5)) 

现在,计算比例,并创建一个新的对象:

dat2 <- rbind(B = dat$B/sum(dat$B), C = c(dat$B[1:2]/sum(dat$B[1:2]), 0)) 
colnames(dat2) <- dat$A 

简介:

barplot(dat2, beside = TRUE, legend = rownames(dat2)) 

enter image description here

1

你针锋相对因为直方图在x轴上的连续比例尺不同于条形图,因此它应该更改为“闪避条形图”而不是二维直方图,并且它们基本上用于比较单变量数据的分布或模拟依赖因子的单变量数据的分布。您正在尝试比较colB和colC,可以使用2D散点图而非条形图来有效显示colB和colC。使用直方图比较colB和colC分布的更好方法是分别绘制两个直方图并检查数据点位置的变化。

如果要比较colB和colC的分布,请尝试以下代码:我已经将值整理得出,以便根据数据描述获取合理的数据。注意随机抽样是通过排列发生的,每次您运行相同的代码,分布会有轻微的变化,但这不会影响colB和colC之间分布的推断。

library("ggplot2") 
# 44 datapoints between 1-10 
a <- rep(1:10, 4) 
a <- c(a, sample(a, size=4, replace=FALSE)) 
# 25 datapoints between 11-20 
b <- rep(11:20, 2) 
b <- c(b, sample(b, size=5, replace=FALSE)) 
# 31 datapoints between 21-30 
c <- rep(21:30, 3) 
c <- c(c, sample(c, size=1, replace=FALSE)) 
colB <- c(a, b, c) 
# 64 datapoints between 1-10 
a <- rep(1:10, 6) 
a <- c(a, sample(a, size=4, replace=FALSE)) 
# 36 datapoints between 11-20 
b <- rep(11:20, 3) 
b <- c(b, sample(b, size=6, replace=FALSE)) 
colC <- c(a, b) 
df <- data.frame(cbind(colB, colC=colC)) 
write.table(df, file = "data") 
data <- read.table("data", header=TRUE) 
data 
ggplot(data=data, aes(x=colB, xmin=1, xmax=30)) + stat_bin(binwidth = 1) 
ggplot(data=data, aes(x=colC, xmin=1, xmax=30)) + stat_bin(binwidth = 1) 

# if you want density distribution, then you can try something like this: 
ggplot(data=data, aes(x=colB, y = ..density.., xmin=1, xmax=30)) + stat_bin(binwidth = 1) 
ggplot(data=data, aes(x=colC, y = ..density.., xmin=1, xmax=30)) + stat_bin(binwidth = 1) 

HTH -Sathish