散点图中丑陋的重叠线(abline)

时间:2017-05-20 10:17:22

标签: r r-car

当我使用scatterplot()abline()一起绘制计算时,我遇到了一个丑陋的重叠回归线问题: enter image description here

只有当线条切割上框架时,才会出现这个错误。不幸的是,它发生在我的数据上我将以下代码示例复制上面的图:

# 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和车2.1-4

2 个答案:

答案 0 :(得分:1)

您可以手动绘制回归线。

# 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的值以进一步向左/右延伸线。

答案 1 :(得分:1)

那令人沮丧。 通过将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")

enter image description here

唯一的问题是,如果你想调整边距(例如通过设置mar=c(2, 2, 2, 2)),将再次在绘图区域之外绘制基线。我不想在其中投入太多的工作,但是当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

找到