如何在 R 中添加第二个 x 轴来标记平均值到直方图的标准差?

问题描述 投票:0回答:1

我不确定如何为置信区间与平均值的标准差数量添加第二组轴标签。

我希望它看起来像下图中的示例,仅具有我计算的值。

Histogram with standard deviations from mean and percentage values example

这是我到目前为止所拥有的。

mu <- 0.4
sd <- 0.3

dist <- rnorm(100000, mu, sd)

density <- seq(min(dist), max(dist), length = 40)

curve <- dnorm(density, mu, sd)

ci_99 <- c(0.4-2.576*sd, 0.4+2.576*sd)
ci_95 <- c(0.4-1.96*sd, 0.4+1.96*sd)
ci_90 <- c(0.4-1.645*sd, 0.4+1.645*sd)

hist(dist,
     probability = TRUE,
     ylim = c(0, max(curve)),
     xaxt = "n",
     col = "lightblue")
axis(side = 1, at = seq(-1, 1.5, 0.1), labels = seq(-1, 1.5, 0.1))
lines(density, curve, col = "black", lwd = 2.5)
abline(v = c(ci_99[1], ci_99[2]), col = "red", lty = 2, lwd = 2)
abline(v = c(ci_95[1], ci_95[2]), col = "purple", lty = 2, lwd = 2)
abline(v = c(ci_90[1], ci_90[2]), col = "darkgreen", lty = 2, lwd = 2)
abline(v = mu, col = "black", lty = 2, lwd = 2)
legend("topright", 
       legend = c("99%-CI", "95%-CI", "90%-CI", "Mean"),
       fill = c("red", "purple", "darkgreen", "black"),
       cex = 1,
       x.intersp = 1,  
       y.intersp = 1)
r histogram
1个回答
0
投票

将所需的图形重新创建为您所呈现的图形时的一个小问题是数据中的方差较小,因此轴标签的布局并不像图中的那样很好。

尽管如此,尝试这样做可以非常接近您提供的图像。我会使用

segments
而不是
abline
并获得第二个轴,只需添加另一个
axis(..., padj = 2)
:

hist(dist,
     probability = TRUE,
     ylim = c(0, max(curve)),
     xaxt = "n",
     col = "lightblue", border = "lightblue", xlab = "", main = "")
axis(side = 1, at = seq(-1, 2, 0.2), labels = seq(-1, 2, 0.2))
lines(density, curve, col = "black", lwd = 2.5)
#abline(v = c(ci_99[1], ci_99[2]), col = "red", lty = 2, lwd = 2)
segments(x0 = ci_99[1], x1 = ci_99[2], y0 = max(curve[density < ci_99[1]]), col = "red", lty = 2, lwd = 2)
segments(x0 = c(ci_99[1], ci_99[2]), y0 = 0, y1 = max(curve[density < ci_99[1]]), col = "red", lty = 2, lwd = 2)
segments(x0 = ci_95[1], x1 = ci_95[2], y0 = max(curve[density < ci_95[1]]), col = "purple", lty = 2, lwd = 2)
segments(x0 = c(ci_95[1], ci_95[2]), y0 = 0, y1 = max(curve[density < ci_95[1]]), col = "purple", lty = 2, lwd = 2)
segments(x0 = ci_90[1], x1 = ci_90[2], y0 = max(curve[density < ci_90[1]]), col = "darkgreen", lty = 2, lwd = 2)
segments(x0 = c(ci_90[1], ci_90[2]), y0 = 0, y1 = max(curve[density < ci_90[1]]), col = "darkgreen", lty = 2, lwd = 2)
text(x = mean(density), y = max(curve[density < ci_99[1]]) + 0.05, labels = "99.74", cex = 0.7)
text(x = mean(density), y = max(curve[density < ci_95[1]]) + 0.05, labels = "95.44", cex = 0.7)
text(x = mean(density), y = max(curve[density < ci_90[1]]) + 0.05, labels = "68.26", cex = 0.7)
axis(side = 1, at = c(ci_99, ci_95, ci_90), labels = parse(text = paste(c(-3,3,-2,2,-1,1),"~sigma", sep = "")),
       padj = 2, tick = FALSE)

如您所见,由于 SD 非常接近,我必须使图形更宽以避免它们相互重叠。

或者如果您希望它看起来像您引用的图:

hist(dist,
     probability = TRUE,
     ylim = c(0, max(curve)),
     xaxt = "n",
     col = NA, border = NA, xlab = "", main = "")
axis(side = 1, at = seq(-1, 2, 0.2), labels = seq(-1, 2, 0.2))
lines(density, curve, col = "maroon", lwd = 2.5)
#abline(v = c(ci_99[1], ci_99[2]), col = "red", lty = 2, lwd = 2)
segments(x0 = ci_99[1], x1 = ci_99[2], y0 = max(curve[density < ci_99[1]]), col = "red", lty = 2, lwd = 2)
segments(x0 = c(ci_99[1], ci_99[2]), y0 = 0, y1 = max(curve[density < ci_99[1]]), col = "red", lty = 2, lwd = 2)
segments(x0 = ci_95[1], x1 = ci_95[2], y0 = max(curve[density < ci_95[1]]), col = "purple", lty = 2, lwd = 2)
segments(x0 = c(ci_95[1], ci_95[2]), y0 = 0, y1 = max(curve[density < ci_95[1]]), col = "purple", lty = 2, lwd = 2)
segments(x0 = ci_90[1], x1 = ci_90[2], y0 = max(curve[density < ci_90[1]]), col = "darkgreen", lty = 2, lwd = 2)
segments(x0 = c(ci_90[1], ci_90[2]), y0 = 0, y1 = max(curve[density < ci_90[1]]), col = "darkgreen", lty = 2, lwd = 2)
text(x = mean(density), y = max(curve[density < ci_99[1]]) + 0.05, labels = "99.74", cex = 0.7)
text(x = mean(density), y = max(curve[density < ci_95[1]]) + 0.05, labels = "95.44", cex = 0.7)
text(x = mean(density), y = max(curve[density < ci_90[1]]) + 0.05, labels = "68.26", cex = 0.7)
axis(side = 1, at = c(ci_99, ci_95, ci_90), labels = parse(text = paste(c(-3,3,-2,2,-1,1),"~sigma", sep = "")),
       padj = 2, tick = FALSE)

© www.soinside.com 2019 - 2024. All rights reserved.