散点图回归线的lty命令无法识别。

3
我一直在使用Car包中的scatterplot命令创建数据图,并尝试对其进行修改以便于出版。因此,需要将彩色线条更改为实线和虚线以便于黑白打印。我认为lty是执行此操作的正确命令。在scatterplot的帮助文件中,它有一个名为by.groups的函数,我认为这会干扰我在代码中使用legend的lty = c(1,2)或lty = 1:2的想法。如果人们愿意,我不知道如何在ggplot中做到这一点,所以建议在那里进行。以下是一些示例数据:
structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 32L, 33L, 
33L, 34L, 34L, 34L), .Label = c("F07001", "F07002", "F07003", 
"F07004", "F07005", "F07006", "F07008", "F07009", "F07010", "F07011", 
"F07014", "F07015", "F07017", "F07018", "F07019", "F07020", "F07021", 
"F07022", "F07023", "F07024", "F10001", "F10004", "F10008", "F10009", 
"F10010", "F10012", "F10013", "F98015", "M07007", "M07012", "M07013", 
"M07016", "M10007", "M10011", "M10015"), class = "factor"), Season = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L), .Label = c("SUM", "WIN"
), class = "factor"), Time = structure(c(1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L), .Label = c("day", "night"), class = "factor"), 
    Repro = structure(c(2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
    3L), .Label = c("f", "fc", "m"), class = "factor"), Comp1 = c(-0.524557195, 
    -0.794214153, -0.408247216, -0.621285004, -0.238828585, 0.976634392, 
    -0.202405922, -0.633821539, -0.306163898, -0.302261589, 1.218779672
    ), ln1wr = c(0.833126490613386, 0.824526258616325, 0.990730077688989, 
    0.981816265754353, 0.933462450382474, 1.446048015519, 1.13253050687157, 
    1.1349442179155, 1.14965388471562, 1.14879830358128, 1.14055365645628
    )), .Names = c("ID", "Season", "Time", "Repro", "Comp1", 
"ln1wr"), row.names = c(1L, 2L, 3L, 4L, 5L, 220L, 221L, 222L, 
223L, 224L, 225L), class = "data.frame")

我已经写了这段代码:

这是我迄今为止编写的代码:

par(bty="l",las=1)
scatterplot(Comp1~ln1wr|Season, moose,
            xlab = "Wolf risk", ylab = "Principal component 1",
            labels= row.names(moose),
            by.groups=TRUE, smooth=FALSE, boxplots=FALSE,
            grid=FALSE, lty = 1:2,
            legend.plot=FALSE)
legend("bottomright", title="Season",
       legend=levels(moose$Season), bty="n",
       pch=1:2, col=1:2, lty=c(1,2))

我已经查看了“scatterplot”代码,我相当确定你不能在不进行以下两种操作之一的情况下获得所需的结果:(1)黑客攻击代码(尽管这是一个非常小的黑客攻击),或者(2)转移到ggplot。如果有机会,我稍后会发布答案,如果有人没有先于我回答的话。 - Ben Bolker
2个回答

3

这是一些与 Lattice 相关的内容:

 xyplot(Comp1~ln1wr, 
        data=moose,
        groups=Season,
        xlab = "Wolf risk", ylab = "Principal component 1",
        par.settings=list(superpose.symbol=list(pch=1:2, col=1),
                          superpose.line=list(lty=1:2, col=1)),
        panel = function(x, y, ...) {
          panel.superpose(x, y, ...,
                          panel.groups = function(x,y, col, col.symbol, lty, ...) {
                            panel.xyplot(x, y, col=col.symbol, ...)
                            panel.abline(lm(y~x), col.line=col.symbol, lty=lty)
                          }
          )
        },
        auto.key=list(title='Season', space='inside', 
                      #text=c('Summer', 'Winter'),
                      lines=TRUE)
 )

enter image description here


2
抱歉@BenBolker,在看到您的评论之前,我已经开始处理这个问题了:
是的,似乎黑客攻击scatterplot.default函数是解决这个问题的一种方法。
由于它是一个非导出函数,所以这有点棘手,但在这里'tis。
# Get function and create copy to edit:
mySP <- car:::scatterplot.default

# Change part of function that plots lines to index lty by i
body(mySP)[[34]][[4]][[4]][[3]][[3]][[3]] <- 
  quote(reg(reg.line, .x[subs], .y[subs], lty = lty[i], lwd = lwd, log.x = logged("x"), 
    log.y = logged("y"), col = col[i]))

# Assign altered function back to package namespace
assignInNamespace("scatterplot.default", mySP, "car")

现在您的代码应该生成一条实线和一条虚线。

不用道歉,你帮我省去了麻烦!联系维护者(John Fox)是值得的,因为这在代码中只是一个微不足道的修复... - Ben Bolker
1
@BenBolker 我联系了John Fox,他说:“你不能使用scatterplot()实现这个功能,至少不修改程序的情况下是不行的。尤其是,虽然在按组绘图时可以更改组的符号和颜色,但无法更改线型。设置lty(如?scatterplot中所述)可控制LS线的线型。使用plot()获取所需的图形。您将对图形的各个方面拥有更多控制权。或者,您可以通过使用黑色和灰色来区分组。” - Kerry
@BenBarnes 谢谢!我想我可能会尝试学习lattice或ggplot,而不是深入代码。那种知识远远超出了我的技能范围,我甚至不知道将来何时需要使用它! - Kerry
@Kerry,学习lattice和/或ggplot2绝对是个好主意,而且不仅仅是为了解决这个问题!它们都是优秀的图形包。感谢联系John Fox。 - BenBarnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接