ggplot2中size=与linewidth=的关联困惑及实验疑问
ggplot2中点、线、文本元素size与linewidth的关联困惑解析
文档理解与预期
根据tidyverse美学规范文档:
- 线(Linewidth小节):旧版线使用的
size参数因历史误差,单位约为0.75mm,为兼容旧图未修正;新版改用linewidth参数,单位已修正为1mm; - 点(Colour and Fill小节):填充部分直径由
size控制,描边宽度由stroke控制,二者单位均为mm; - 文本(Font size小节):
geom_text()的size单位为mm,与新版线、点的尺寸单位统一(注:element_text()中的size单位为pts)。
原理解预期:
- 相同数值下,文本与点的总尺寸(填充+描边)应一致;
- 线因历史误差尺寸更小。
实验与不符结果
实验代码
ggplot() + geom_hline(yintercept=1,linewidth=20) + geom_text(data=data.frame(x=0.5,y=1,label="Text"), mapping=aes(x=x,y=y,label=label), size=20,color="red") + geom_point(data=data.frame(x=0.4,y=1),mapping=aes(x=x,y=y), pch=21,size=10,stroke=10,fill="red",color="blue") + geom_point(data=data.frame(x=0.6,y=1),mapping=aes(x=x,y=y), pch=21,size=20,stroke=0,fill="orange") + geom_point(data=data.frame(x=0.7,y=1),mapping=aes(x=x,y=y), pch=21,size=0,stroke=20,color="green") + geom_point(data=data.frame(x=0.8,y=1),mapping=aes(x=x,y=y), pch=21,size=10,stroke=10*0.75,fill="orange",color="green") + scale_x_continuous(limit=c(0.35,0.85)) + theme_void()
实验结果与预期不符点
- 文本与线高度一致,原预期线应更小;
- 蓝红配色点(
size=10+stroke=10)比线和文本大,原预期与文本尺寸一致; - 仅
size=20的橙色点和仅stroke=20的绿色点尺寸不同,原预期二者应相等; - 最后一个橙绿点(
size=10+stroke=7.5)与仅size=20的橙色点尺寸一致,无明确预期。
核心理解错误点
1. 线参数的新旧差异
文档中提到的“历史误差0.75mm单位”针对的是ggplot2 3.4.0之前线使用的size参数,新版(3.4.0及以后)线改用linewidth参数,单位已修正为1mm,和文本size、点的size/stroke单位完全统一。这就是实验中线与文本尺寸一致的原因。
2. 点总尺寸的计算逻辑
点的总直径并非size + stroke,而是size + 2*stroke:
size是填充区域的直径(mm);stroke是单侧描边的宽度(mm),因此总直径需要加上两侧的描边宽度。
对应实验结果:
- 蓝红配色点总直径为
10 + 2*10 = 30mm,远大于线和文本的20mm,所以视觉上更大; - 仅
size=20的橙色点直径为20mm,仅stroke=20的绿色点总直径为0 + 2*20 = 40mm,二者尺寸自然不同。
3. 最后一个点的结果说明
最后一个橙绿点总直径为10 + 2*7.5 = 25mm,理论上应比仅size=20的橙色点大,出现视觉一致的情况可能是设备渲染的细微差异或视觉错觉。
总结
核心错误在于两个认知偏差:
- 混淆了线的新旧参数(旧
sizevs 新linewidth)的单位差异,新版linewidth已实现单位统一; - 错误理解点的总尺寸计算方式,正确逻辑是填充直径加两倍描边宽度。
内容的提问来源于stack exchange,提问作者D Ogle
相关产品推荐
相关产品推荐

