1

我是 R 新手,我想知道如何为以下情况生成直方图:

我最初有一个包含 2 列的常规频率表:A 列是类别(或 bin),B 列是属于该类别的案例数

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

从这个初始频率表中,我创建了一个包含 3 列的表:Col A 再次是类别(或 bin),但现在 Col 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 的 bar”。

任何帮助将不胜感激。

4

2 回答 2

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

在此处输入图像描述

于 2012-09-23T02:49:21.703 回答
1

您的标题应更改为“闪避条形图”而不是 2D 直方图,因为直方图与条形图不同,在 x 轴上具有连续比例,并且它们基本上用于比较单变量数据的分布或基于依赖因素建模的单变量数据的分布. 您正在尝试比较 colB 与 colC ,它们可以使用 2D 散点图有效地可视化,但不能使用条形图。使用直方图比较 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

于 2012-09-23T05:39:12.947 回答