You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)))

示例:符号大小按Ellipse而非Hour缩放

解决方案

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

代码说明

  1. 先通过panel.superpose绘制Ellipse分组的连线,保证分组的线图逻辑正常。
  2. 提取当前面板对应的Hour值,再在绘制点时,为每个分组内的点匹配对应的cex值,实现符号大小随Hour递增的效果。

内容的提问来源于stack exchange,提问作者Seth W. Bigelow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:37:36