Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scatterplot regression line lty command is not being recognized

Ive been using the scatterplot command from the Car package to create a plot of my data and I am trying to refine the image for publication. Thus it needs to be in black and white which means I need to change the colored lines to a solid and dashed line. I thought that lty would be the proper command to do this. Within the help of scatterplot, it has a function called by.groups and I think that this is somehow interfering with the lty = c(1,2) or lty = 1:2 idea that I used with the legend part of the code. I don't know how to do this in ggplot so suggestions there would be appreciated if people are so inclined.

here's some example data:

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")

This is the code Ive written thus far:

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))
like image 843
Kerry Avatar asked May 09 '26 16:05

Kerry


2 Answers

Here is something in 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

like image 124
Matthew Lundberg Avatar answered May 12 '26 07:05

Matthew Lundberg


Sorry @BenBolker, I started to work on this before seeing your comment:

Yes, it looks like hacking the scatterplot.default function would be a way to solve this.

Since it's a non-exported function, this is a bit tricky, but here '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")

Now your code should yield one solid and one dashed line.

like image 28
BenBarnes Avatar answered May 12 '26 07:05

BenBarnes



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!