ggplot2内部中“训练”非位置数据的含义是什么?
ggplot2中非位置美学的“训练”机制解析
一、什么是“训练”非位置数据?
在ggplot2中,“训练”非位置数据的核心是让尺度(Scale)对象学习输入数据的特征,为后续的映射做准备:
- 对于离散美学(如颜色、线型):训练过程会识别数据中的所有唯一类别,生成对应的映射规则(比如给每个类别分配固定颜色);
- 对于连续美学(如尺寸、透明度):训练过程会统计数据的范围(最小值、最大值),确定映射的区间范围。
这个过程是为了把原始数据(比如cyl的4/6/8、mpg的数值)转换成grid绘图系统能直接识别的图形参数(比如RGB颜色值、线宽像素值)。
二、为什么lapply(data, npscales$train_df)不需要赋值?
你观察到的lapply(data, npscales$train_df)返回NULL但依然有效,原因在于:
ggplot2的尺度对象是引用类型的RC(Reference Class)对象,train_df方法会直接修改尺度对象内部的属性(比如$range、$limits、$levels),而不是返回新的数据。也就是说,训练过程是在“修改尺度自身的状态”,而非修改输入的data,所以不需要把lapply的结果赋值回去。
对比后续的data <- lapply(data, npscales$map_df):map_df是基于训练好的尺度规则,把原始数据转换成grid可用的图形参数值,这一步是修改数据本身,所以需要赋值回data。
三、结合代码解析完整流程
# Train and map non-position scales and guides npscales <- scales$non_position_scales() if (npscales$n() > 0) { lapply(data, npscales$train_df) # 训练尺度:让尺度学习数据特征 plot$guides <- plot$guides$build(npscales, plot$layers, plot$labels, data) # 基于训练后的尺度构建图例 data <- lapply(data, npscales$map_df) # 映射数据:把原始数据转成grid可用的参数 } else { # Only keep custom guides if there are no non-position scales plot$guides <- plot$guides$get_custom() }
- 获取非位置尺度:先提取所有非位置类的尺度(比如颜色、线型、尺寸对应的scale对象);
- 训练尺度:遍历每个图层的数据集,调用
train_df让尺度记录数据的关键特征(离散值的类别、连续值的范围); - 构建图例:图例需要基于训练后的尺度信息来生成(比如展示所有颜色对应的类别);
- 映射数据:将原始数据按照训练好的尺度规则,转换成grid能识别的图形参数值,最终用于绘图。
直观例子
比如绘制散点图:
ggplot(mtcars, aes(mpg, hp, color=cyl)) + geom_point()
- 训练阶段:
scale_colour_discrete会识别cyl的唯一值(4、6、8),给每个值分配对应的颜色,尺度内部会记录这个映射关系; - 映射阶段:把每个数据点的
cyl值转换成对应的RGB颜色值,传递给grid系统绘制出带颜色的点。
内容的提问来源于stack exchange,提问作者Dubukay
相关产品推荐
相关产品推荐

