Reputation: 933
I'm trying to create a line plot using groups and panels that superposes a symbol on the first value of each group. This attempt plots the first point of the first group only and does nothing for the other two groups.
library(lattice)
foo <- data.frame(x=-100:100, y=sin(c(-100:100)*pi/4))
xyplot( y~x | y>0, foo, groups=cut(x,3),
panel = function(x, y, subscripts, ...) {
panel.xyplot(x, y, subscripts=subscripts, type='l', ...)
# almost but not quite:
panel.superpose(x[1], y[1], subscripts=subscripts, cex=c(1,0), ...)
} )
General solutions would be appreciated, to allow plotting of specific points within each group and panel (e.g., first, middle, and endpoints).
Upvotes: 3
Views: 1002
Reputation: 121618
(Thanks for this good lattice
question.) You should use Subscripts because it is the mechanism for picking individual data points for panels : Here you want to pick the groups
by panel: groups[subscripts]
. Once you have the right grouping variables you can use it to split your data and pick the first element of each group:
## first points
xx = tapply(x,groups[subscripts],'[',1)
yy = tapply(y,groups[subscripts],'[',1)
## end points
xx = tapply(x,groups[subscripts],tail,1)
yy = tapply(y,groups[subscripts],tail,1)
The you plot the point using panel.points
(higher level than the basic panel.superpose
).
library(lattice)
foo <- data.frame(x=-100:100, y=sin(c(-100:100)*pi/4))
xyplot( y~x | y>0, foo, groups=cut(x,3),
panel = function(x, y, subscripts, groups,...) {
panel.xyplot(x, y, subscripts=subscripts, type='l',groups=groups, ...)
# Note the use `panel.points` and the grouping using groups[subscripts]
panel.points(tapply(x,groups[subscripts],'[',1),
tapply(y,groups[subscripts],'[',1),
cex=2,pch=20, ...)
} )
In case you want to color points according the color groups, you should add a groups argument to panel.points
. (I leave you this as an exercise)
Upvotes: 5