如何使散点图中的趋势线符合 x 轴的边界?
How to make the trend-line in a scatter plot respect the boundaries of the x-axis?
我正在创建一个绘图,在其中绘制 X 轴上的变量与 Y 轴上的变量,我还添加了变量的直方图。我使用 abline()
在图中添加了一条趋势线。
问题是它似乎不尊重绘图区域中的 xlim = c(0, 20)
,因为它超出了 x 轴的限制。我尝试使用 xpd
选项,但无济于事。接下来我尝试摆弄不同的 par()
选项,但没有发现任何可以帮助解决这个问题的方法。
我想要的是趋势线是 x 轴的精确长度。任何帮助深表感谢。在这种特殊情况下,趋势线几乎是平坦的,但当我对其他变量执行相同操作时,斜率会发生变化。
MWE -- 注意:我只提供 15 个数据点来说明问题,因此图表将与提供的图像不同。
df.data <- data.frame(id = 1:15,
ll = c(-9.53026, -6.50640,-6.50640, -7.68535, -11.80899, -8.42790,
-6.50640, -6.50640, -7.92405, -6.50640, -8.95522, -9.99228,
-10.02286, -8.95969, -6.07313),
aspm = c(4.582104, 0.490244, 0.737765, 0.256699, 1.575931, 1.062693,
1.006984, 0.590355, 1.014370, 0.924855, 0.735989, 0.831025,
1.197886, 1.143220, 0.928068))
str.col.light.blue <- c(rgb(r = 110/255, g = 155/255, b = 225/255))
str.col.dark.blue <- c(rgb(r = 50/255, g = 100/255, b = 185/255))
layout(matrix(c(2, 4, 1, 3), 2, 2, byrow = TRUE), widths = c(5, 2), heights = c(2, 5))
layout.show(4)
par(omi = c(0.1, 0.1, 0.1, 0.1))
par(mar = c(2, 2, 0, 0))
par(mai = c(1, 1, 0, 0))
plot(df.data[, "ll"] ~ df.data[, "aspm"], col = str.col.light.blue,
xlim = c(0, 20), ylim = c(-15, -5), axes = FALSE,
xlab = "X1", ylab = "X2",
cex.lab = 1.25)
abline(a = -8.156670, b = -0.000879, lty = 5, col = "black", lwd = 2, xpd = FALSE)
axis(1, at = seq(0, 20, by = 5), labels = seq(0, 20, by = 5), cex.axis = 1)
axis(2, at = seq(-15, -5, by = 3), labels = seq(-15, -5, by = 3), cex.axis = 1, las = 1)
rect(0, -15, 20, log(1/3)*8, density = 10, angle = 45, lwd = 0.5, col = "gray")
par(mar = c(0, 2, 0, 0))
par(mai = c(0, 1, 0.25, 0))
x.hist <- hist(df.data[, "aspm"], plot = FALSE, breaks = 20)
barplot(x.hist$density, axes = FALSE, horiz = FALSE, space = 0, col = str.col.dark.blue)
par(mar = c(2, 0, 0, 0))
par(mai = c(1, 0, 0, 0.25))
y.hist <- hist(df.data[, "ll"], plot = FALSE, breaks = 20)
barplot(y.hist$density, axes = FALSE, horiz = TRUE, space = 0, col = str.col.dark.blue)
为了避免计算出线段的起点和终点,您可以编写一个辅助函数来为您完成。
linear <- function(x, a, b) a + b*x
然后,我使用了您的代码并进行了以下更改。 abline
已替换为 segments
,其中包含您在原始调用中使用的所有图形参数。
x0 <- 0
y0 <- linear(x0, a = -8.156670, b = -0.000879)
x1 <- 20
y1 <- linear(x1, a = -8.156670, b = -0.000879)
segments(x0, y0, x1, y1, lty = 5, col = "black", lwd = 2, xpd = FALSE)
对 segment
的调用被放置在 abline
所在的位置。
在最后一张图中,我看到了一个表现良好的部分。
我正在创建一个绘图,在其中绘制 X 轴上的变量与 Y 轴上的变量,我还添加了变量的直方图。我使用 abline()
在图中添加了一条趋势线。
问题是它似乎不尊重绘图区域中的 xlim = c(0, 20)
,因为它超出了 x 轴的限制。我尝试使用 xpd
选项,但无济于事。接下来我尝试摆弄不同的 par()
选项,但没有发现任何可以帮助解决这个问题的方法。
我想要的是趋势线是 x 轴的精确长度。任何帮助深表感谢。在这种特殊情况下,趋势线几乎是平坦的,但当我对其他变量执行相同操作时,斜率会发生变化。
MWE -- 注意:我只提供 15 个数据点来说明问题,因此图表将与提供的图像不同。
df.data <- data.frame(id = 1:15,
ll = c(-9.53026, -6.50640,-6.50640, -7.68535, -11.80899, -8.42790,
-6.50640, -6.50640, -7.92405, -6.50640, -8.95522, -9.99228,
-10.02286, -8.95969, -6.07313),
aspm = c(4.582104, 0.490244, 0.737765, 0.256699, 1.575931, 1.062693,
1.006984, 0.590355, 1.014370, 0.924855, 0.735989, 0.831025,
1.197886, 1.143220, 0.928068))
str.col.light.blue <- c(rgb(r = 110/255, g = 155/255, b = 225/255))
str.col.dark.blue <- c(rgb(r = 50/255, g = 100/255, b = 185/255))
layout(matrix(c(2, 4, 1, 3), 2, 2, byrow = TRUE), widths = c(5, 2), heights = c(2, 5))
layout.show(4)
par(omi = c(0.1, 0.1, 0.1, 0.1))
par(mar = c(2, 2, 0, 0))
par(mai = c(1, 1, 0, 0))
plot(df.data[, "ll"] ~ df.data[, "aspm"], col = str.col.light.blue,
xlim = c(0, 20), ylim = c(-15, -5), axes = FALSE,
xlab = "X1", ylab = "X2",
cex.lab = 1.25)
abline(a = -8.156670, b = -0.000879, lty = 5, col = "black", lwd = 2, xpd = FALSE)
axis(1, at = seq(0, 20, by = 5), labels = seq(0, 20, by = 5), cex.axis = 1)
axis(2, at = seq(-15, -5, by = 3), labels = seq(-15, -5, by = 3), cex.axis = 1, las = 1)
rect(0, -15, 20, log(1/3)*8, density = 10, angle = 45, lwd = 0.5, col = "gray")
par(mar = c(0, 2, 0, 0))
par(mai = c(0, 1, 0.25, 0))
x.hist <- hist(df.data[, "aspm"], plot = FALSE, breaks = 20)
barplot(x.hist$density, axes = FALSE, horiz = FALSE, space = 0, col = str.col.dark.blue)
par(mar = c(2, 0, 0, 0))
par(mai = c(1, 0, 0, 0.25))
y.hist <- hist(df.data[, "ll"], plot = FALSE, breaks = 20)
barplot(y.hist$density, axes = FALSE, horiz = TRUE, space = 0, col = str.col.dark.blue)
为了避免计算出线段的起点和终点,您可以编写一个辅助函数来为您完成。
linear <- function(x, a, b) a + b*x
然后,我使用了您的代码并进行了以下更改。 abline
已替换为 segments
,其中包含您在原始调用中使用的所有图形参数。
x0 <- 0
y0 <- linear(x0, a = -8.156670, b = -0.000879)
x1 <- 20
y1 <- linear(x1, a = -8.156670, b = -0.000879)
segments(x0, y0, x1, y1, lty = 5, col = "black", lwd = 2, xpd = FALSE)
对 segment
的调用被放置在 abline
所在的位置。
在最后一张图中,我看到了一个表现良好的部分。