Reputation: 803
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))
Upvotes: 3
Views: 1351
Reputation: 19454
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.
Upvotes: 2
Reputation: 42629
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)
)
Upvotes: 3