散点图中丑陋的重叠线(abline)
Ugly overlapping line (abline) in scatterplot
当我结合 scatterplot()
和 abline()
绘制我的计算时,我遇到了一个看起来很丑陋的重叠回归线的问题:
该错误似乎仅在线切割上框架时出现。不幸的是,它发生在我的数据上。我给出以下代码示例重现上面的情节:
# setting seed vector which reproduces the error
set.seed(684654)
# create data-frame
value1 <- rnorm(500,40,10)
value2 <- sqrt(rnorm(500,25,15)^2)
value3 <- sqrt(rnorm(500,10,15)^4)
df <- data.frame(value1, value2, value3)
# categorize quantils of value2
library(dplyr)
q <- quantile(value2)
df <- df %>%
mutate(cat=ifelse(value2 < q[2], "1st Qu.", NA),
cat=ifelse(value2 >= q[2] & value2 < q[3], "2nd Qu.", cat),
cat=ifelse(value2 >= q[3] & value2 < q[4], "3rd Qu.", cat),
cat=ifelse(value2 >= q[4], "4th Qu.", cat))
# regress model and save outcome to vector
lmf <- lm(log(value3) ~ value1 + factor(cat) - 1, data=df)
y.hat <- lmf$fitted
# scatterplot
library(car)
scatterplot(y.hat ~ value1 | cat,
smooth=FALSE, boxplots=FALSE, data=df,
grid=FALSE)
# regression line
library(graphics)
abline(lm(y.hat ~ df$value1), lwd=2, col="red")
自相矛盾的是,当我简单地绘制以下内容时,错误并没有发生,所以我假设有点累积问题:
a <- log(rnorm(100,25,9))
b <- rnorm(100,1,.5)
scatterplot(a ~ b, smooth=FALSE, boxplots=FALSE, grid=FALSE)
abline(a=1, b=2, lwd=2, col="red")
有没有人知道解决这个问题并在不需要 Photoshop 的情况下制作整洁的图?谢谢!
PS:我使用的是 R 3.4.0 和 car 2.1-4
您可以手动绘制回归线。
# get regression coefficients
cfs <- coef(lm(y.hat ~ df$value1))
# draw regression line
curve({cfs[1] + x*cfs[2]}, add = TRUE, lwd = 2, col = "red",
from = 12, to = 70)
调整 from
的值以将线进一步向左/向右延伸。
这真令人沮丧。
我通过将 xpd
显式设置为 FALSE
找到了一种解决方案,如下所示:
par(xpd=FALSE)
scatterplot(y.hat ~ value1 | cat,
smooth=FALSE, boxplots=FALSE, data=df,
grid=FALSE)
abline(lm(y.hat ~ df$value1), lwd=2, col="red")
唯一的问题是,如果你想调整页边距(例如通过设置 mar=c(2, 2, 2, 2)
),abline 将再次绘制在绘图区域之外。我不想在它上面投入太多的工作,但是由于设置 par
搞砸了,当 legend.plot=FALSE
时问题不存在,我的直觉是它与
有关]
top <- if (legend.plot && missing(legend.coords)) {
if (missing(legend.columns))
legend.columns <- find.legend.columns(nlevels(groups))
4 + ceiling(nlevels(groups))/legend.columns
和
par(mar = c(mar[1], 0, top, 0))
if (ybox > 0)
vbox(.y)
par(mar = c(0, mar[2], 0, mar[4]))
if (xbox > 0)
hbox(.x)
par(mar = c(mar[1:2], top, mar[4]))
(输入car:::scatterplot.default
可以查到)
当我结合 scatterplot()
和 abline()
绘制我的计算时,我遇到了一个看起来很丑陋的重叠回归线的问题:
该错误似乎仅在线切割上框架时出现。不幸的是,它发生在我的数据上。我给出以下代码示例重现上面的情节:
# setting seed vector which reproduces the error
set.seed(684654)
# create data-frame
value1 <- rnorm(500,40,10)
value2 <- sqrt(rnorm(500,25,15)^2)
value3 <- sqrt(rnorm(500,10,15)^4)
df <- data.frame(value1, value2, value3)
# categorize quantils of value2
library(dplyr)
q <- quantile(value2)
df <- df %>%
mutate(cat=ifelse(value2 < q[2], "1st Qu.", NA),
cat=ifelse(value2 >= q[2] & value2 < q[3], "2nd Qu.", cat),
cat=ifelse(value2 >= q[3] & value2 < q[4], "3rd Qu.", cat),
cat=ifelse(value2 >= q[4], "4th Qu.", cat))
# regress model and save outcome to vector
lmf <- lm(log(value3) ~ value1 + factor(cat) - 1, data=df)
y.hat <- lmf$fitted
# scatterplot
library(car)
scatterplot(y.hat ~ value1 | cat,
smooth=FALSE, boxplots=FALSE, data=df,
grid=FALSE)
# regression line
library(graphics)
abline(lm(y.hat ~ df$value1), lwd=2, col="red")
自相矛盾的是,当我简单地绘制以下内容时,错误并没有发生,所以我假设有点累积问题:
a <- log(rnorm(100,25,9))
b <- rnorm(100,1,.5)
scatterplot(a ~ b, smooth=FALSE, boxplots=FALSE, grid=FALSE)
abline(a=1, b=2, lwd=2, col="red")
有没有人知道解决这个问题并在不需要 Photoshop 的情况下制作整洁的图?谢谢!
PS:我使用的是 R 3.4.0 和 car 2.1-4
您可以手动绘制回归线。
# get regression coefficients
cfs <- coef(lm(y.hat ~ df$value1))
# draw regression line
curve({cfs[1] + x*cfs[2]}, add = TRUE, lwd = 2, col = "red",
from = 12, to = 70)
调整 from
的值以将线进一步向左/向右延伸。
这真令人沮丧。
我通过将 xpd
显式设置为 FALSE
找到了一种解决方案,如下所示:
par(xpd=FALSE)
scatterplot(y.hat ~ value1 | cat,
smooth=FALSE, boxplots=FALSE, data=df,
grid=FALSE)
abline(lm(y.hat ~ df$value1), lwd=2, col="red")
唯一的问题是,如果你想调整页边距(例如通过设置 mar=c(2, 2, 2, 2)
),abline 将再次绘制在绘图区域之外。我不想在它上面投入太多的工作,但是由于设置 par
搞砸了,当 legend.plot=FALSE
时问题不存在,我的直觉是它与
top <- if (legend.plot && missing(legend.coords)) {
if (missing(legend.columns))
legend.columns <- find.legend.columns(nlevels(groups))
4 + ceiling(nlevels(groups))/legend.columns
和
par(mar = c(mar[1], 0, top, 0))
if (ybox > 0)
vbox(.y)
par(mar = c(0, mar[2], 0, mar[4]))
if (xbox > 0)
hbox(.x)
par(mar = c(mar[1:2], top, mar[4]))
(输入car:::scatterplot.default
可以查到)