如何在R的Lattice中根据数据属性调整符号大小?
问题:Lattice绘图中按Hour调整符号大小失效
我想用Lattice根据数据属性调整符号大小。示例中以Month为条件变量,包含两个Ellipse分组,每个分组对应Hour为1、2、3时的x-y观测值。这是一张点线图,我希望每个Ellipse分组内的符号大小随Hour递增,以此体现时间推进方向。但在下方的xyplot代码中添加cex=d$Hour后,符号仅按Ellipse分组区分大小,没有实现按Hour缩放的效果。
library(lattice) library(data.table) d <- data.table(expand.grid(Hour=1:3, Month=1:3, Ellipse=1:2)) d[, x := c(rnorm(9, mean=1, sd=1),rnorm(9, mean=2, sd=1.5))] d[, y := c(rnorm(9, mean=1, sd=1),rnorm(9, mean=2, sd=2))] xyplot(y ~ x|Month, d, type=c('l','p'), group = Ellipse, cex = d$Hour, auto.key=list(title="Ellipse", corner=c(0.8,0.8)))

解决方案
在Lattice的分组绘图逻辑中,直接传递cex=d$Hour会被按group参数(即Ellipse)进行映射,而非每个数据点的Hour值。要实现每个点按Hour调整大小,同时保留Ellipse分组的连线,可以通过自定义面板函数来实现:
library(lattice) library(data.table) d <- data.table(expand.grid(Hour=1:3, Month=1:3, Ellipse=1:2)) d[, x := c(rnorm(9, mean=1, sd=1),rnorm(9, mean=2, sd=1.5))] d[, y := c(rnorm(9, mean=1, sd=1),rnorm(9, mean=2, sd=2))] xyplot(y ~ x|Month, d, type=c('l','p'), group = Ellipse, panel = function(x, y, subscripts, group, ...) { # 先绘制分组连线 panel.superpose(x, y, subscripts, group, panel.groups = function(x, y, ...) { panel.lines(x, y, ...) }) # 获取当前面板对应的Hour值 cex_vals <- d$Hour[subscripts] # 按分组绘制点,同时应用对应Hour的cex panel.superpose(x, y, subscripts, group, panel.groups = function(x, y, group_num, ...) { panel.points(x, y, cex = cex_vals[group[subscripts] == group_num], ...) }) }, auto.key=list(title="Ellipse", corner=c(0.8,0.8)))
代码说明
- 先通过
panel.superpose绘制Ellipse分组的连线,保证分组的线图逻辑正常。 - 提取当前面板对应的
Hour值,再在绘制点时,为每个分组内的点匹配对应的cex值,实现符号大小随Hour递增的效果。
内容的提问来源于stack exchange,提问作者Seth W. Bigelow
相关产品推荐
相关产品推荐

