【问题标题】:Ugly overlapping line (abline) in scatterplot散点图中丑陋的重叠线(斜线)
【发布时间】:2017-05-20 10:17:22
【问题描述】:

当我使用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 和汽车 2.1-4

【问题讨论】:

    标签: r r-car


    【解决方案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 的值以将线进一步向左/向右延伸。

    【讨论】:

    • 不错的解决方法,另外我想知道如何绘制这种自定义线!
    【解决方案2】:

    这很令人沮丧。 我通过将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找到)

    【讨论】:

    • 似乎是一个狡猾的噱头,但我不能遗憾地让你的代码工作。
    猜你喜欢
    • 2016-07-31
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多