如何在 R 中的直方图顶部同步频率多边形的轴?
How can I synchronize the axes of a frequency polygon on top of a histogram in R?
在 中,我询问了如何在直方图上叠加频率多边形。那个问题就解决了。我现在有一个不同的问题。我希望频率多边形的 class 标记位于每个直方图条的中间。 class 标记 是恰好在 class 中间的值,是通过对直方图条的上下边界进行平均找到的 (a.k.a., "classes").如果我正在绘制频率多边形,我会简单地在每个直方图 class(或条形图)的中间画一个点并将这些点连接起来。但是,当我执行以下代码时,频率多边形为 "spread out," 并且没有与直方图相同的轴值。
# declare your variable
data <- c(10, 7, 8, 4, 5, 6, 6, 9, 5, 6, 3, 8,
+ 4, 6, 10, 5, 9, 7, 6, 2, 6, 5, 4, 8, 7, 5, 6)
# find the range
range(data)
# establish a class width
class_width = seq(1, 11, by=2)
class_width
# create a frequency table
data.cut = cut(data, class_width, right=FALSE)
data.freq = table(data.cut)
cbind(data.freq)
# histogram of this data
hist(data, axes=TRUE,
breaks=class_width, col="slategray3",
border = "dodgerblue4", right=FALSE,
xlab = "Scores", xaxp=c(1, 11, 10),
yaxp=c(0, 12, 12), main = "Histogram and Frequency Polygon")
# paint the frequency polygon over the histogram
par(new=TRUE)
# create a frequency polygon for the data
plot(data.freq, axes=FALSE, type="b", ann=FALSE)
这是 RGui 生成的图像。我用 MS Paint 画了红线,表示我想让 R 执行什么。这两个图似乎具有相同的 y 轴值。如何让这两个图共享相同的 x 轴值?谢谢!
如果您查看 hist(...)
的(不可见的)输出,您会看到几个可能有用的属性。值得注意的是:$mids
。 (它们在 ?hist
中定义明确。)
在 hist
通话之前使用您的数据:
h <- hist(data, axes=TRUE,
breaks=class_width, col="slategray3",
border = "dodgerblue4", right=FALSE,
xlab = "Scores", xaxp=c(1, 11, 10),
yaxp=c(0, 12, 12), main = "Histogram and Frequency Polygon")
str(h)
# List of 6
# $ breaks : num [1:6] 1 3 5 7 9 11
# $ counts : int [1:5] 1 4 12 6 4
# $ density : num [1:5] 0.0185 0.0741 0.2222 0.1111 0.0741
# $ mids : num [1:5] 2 4 6 8 10
# $ xname : chr "data"
# $ equidist: logi TRUE
# - attr(*, "class")= chr "histogram"
不需要 par(new=TRUE)
只需添加一行:
lines(h$mids, data.freq)
如果这是一个您必须使用par(new=TRUE)
的简化示例,那么您需要做两件事:设置xlim
/ylim
你的第二行,并给予适当的 X 分。 (你可能没有意识到,但是第二个图是在这里推断 1:5
的 X 值。只做 plot(data.freq)
看看。)
par(new = TRUE)
xlim <- range(class_width)
ylim <- c(0, max(h$counts))
plot(h$mids, data.freq, axes = FALSE, type = "b", ann = FALSE,
xlim = xlim, ylim = ylim)
在
# declare your variable
data <- c(10, 7, 8, 4, 5, 6, 6, 9, 5, 6, 3, 8,
+ 4, 6, 10, 5, 9, 7, 6, 2, 6, 5, 4, 8, 7, 5, 6)
# find the range
range(data)
# establish a class width
class_width = seq(1, 11, by=2)
class_width
# create a frequency table
data.cut = cut(data, class_width, right=FALSE)
data.freq = table(data.cut)
cbind(data.freq)
# histogram of this data
hist(data, axes=TRUE,
breaks=class_width, col="slategray3",
border = "dodgerblue4", right=FALSE,
xlab = "Scores", xaxp=c(1, 11, 10),
yaxp=c(0, 12, 12), main = "Histogram and Frequency Polygon")
# paint the frequency polygon over the histogram
par(new=TRUE)
# create a frequency polygon for the data
plot(data.freq, axes=FALSE, type="b", ann=FALSE)
这是 RGui 生成的图像。我用 MS Paint 画了红线,表示我想让 R 执行什么。这两个图似乎具有相同的 y 轴值。如何让这两个图共享相同的 x 轴值?谢谢!
如果您查看 hist(...)
的(不可见的)输出,您会看到几个可能有用的属性。值得注意的是:$mids
。 (它们在 ?hist
中定义明确。)
在 hist
通话之前使用您的数据:
h <- hist(data, axes=TRUE,
breaks=class_width, col="slategray3",
border = "dodgerblue4", right=FALSE,
xlab = "Scores", xaxp=c(1, 11, 10),
yaxp=c(0, 12, 12), main = "Histogram and Frequency Polygon")
str(h)
# List of 6
# $ breaks : num [1:6] 1 3 5 7 9 11
# $ counts : int [1:5] 1 4 12 6 4
# $ density : num [1:5] 0.0185 0.0741 0.2222 0.1111 0.0741
# $ mids : num [1:5] 2 4 6 8 10
# $ xname : chr "data"
# $ equidist: logi TRUE
# - attr(*, "class")= chr "histogram"
不需要 par(new=TRUE)
只需添加一行:
lines(h$mids, data.freq)
如果这是一个您必须使用par(new=TRUE)
的简化示例,那么您需要做两件事:设置xlim
/ylim
你的第二行,并给予适当的 X 分。 (你可能没有意识到,但是第二个图是在这里推断 1:5
的 X 值。只做 plot(data.freq)
看看。)
par(new = TRUE)
xlim <- range(class_width)
ylim <- c(0, max(h$counts))
plot(h$mids, data.freq, axes = FALSE, type = "b", ann = FALSE,
xlim = xlim, ylim = ylim)