ggplot2 - 尺寸的单位

57

我在网上(或Wickham的书中)找不到答案,有一个小问题:

ggplot2size参数的单位是什么?例如:geom_text(size = 10)中的10使用何种单位?

同样的问题也适用于ggsave(height = 10, width = 10)中的默认单位。


直到现在,我一直认为文本大小是以点(如字体大小)为单位的。尽管如此,这仍然正确吗,只是一个简化的解释吗? 在pdf()postscript()等中,heightwidth以英寸为单位给出,因此假设ggsave也使用英寸会有错吗? - MrGumble
不幸的是,在ggplot2中并没有“单位尺寸参数”,因为有不止一个size参数。geom_text()函数的size参数与element_text()函数的size参数完全不同,我不知道如何调和这两者之间的差异或者为什么它们会不同。 - randy
3个回答

59
答案是:单位是“点”(points)。“点”是在grid软件包中字体大小的单位。在?unit中,我们找到了以下定义。
"points" Points. There are 72.27 points per inch.

(但请注意密切相关的“bigpts” Big Points. 72 bp = 1 in。

ggplot2 在内部将字体大小乘以一个神奇的数字ggplot2:::.pt,定义为1/0.352777778

这里是一个演示,我使用grid和ggplot2创建了一个大小相同的字母:

library(grid)
library(ggplot2)
ggplot(data=data.frame(x=1,y=1,label=c('A'))) +
  geom_text(aes(x,y,label=label),size=100)
## I divide by the magic number to get the same size.
grid.text('A',gp=gpar(fontsize=100/0.352777778,col='red'))

enter image description here

补充 感谢 @baptiste

"魔数"(在 aaa-constants.r 中定义为 .pt <- 1 / 0.352777778) 实际上只是“点”和“毫米”之间的转换因子,即 1/72 * 25.4 = 0.352777778。不幸的是,grid 对 "pts" 和 "bigpts" 进行微妙的区分,这就解释了为什么 convertUnit(unit(1, "pt"), "mm", valueOnly=TRUE) 得到略微不同的值,即 0.3514598


2
ggplot2中使用的魔法数字是fontsize = size * ggplot2:::.pt,它在aaa-constants.r中定义为.pt <- 1 / 0.352777778 - baptiste
2
为了清晰起见,可以注意到 1/72 * 25.4 = 0.352777778,即点 -> 英寸 -> 毫米。网格将点转换为毫米略有不同,可能是因为点的定义有时被认为是设备特定的。 - baptiste
1
我已经编辑过了,但有点凌乱。实际上,有人可能会认为ggplot2使用了一个略微不正确的因子。 - baptiste
12
希望您能重写这个答案。在ggplot2中,尺寸的单位是毫米而非磅,我已经重新定义了.pt为72/25.4,希望这能更清晰地体现在代码中。 - hadley
8
现在我已将其更改为72.27 / 25.4,因为评论中指出,网格使用打印机点而不是Adobe / 大点。 - hadley
显示剩余10条评论

8

与其前身'Lattice'一样,'ggplot2'包建立在'grid'包的基础之上。您可以在以下网址获取可用单元:

?grid::unit
?grid::convertX
?grid::convertY

grid::convertX(grid::unit(72.27, "points"), "inches")

(在大多数情况下,我使用“pkg::func”的形式,因为当加载了“lattice”或者“ggplot2”时,“grid”通常作为命名空间被加载但未附加。)
我之前发布了一条评论,后来删除了,说“size”是以点为单位的。我这么说是因为看到了使用“size=10”时文本的大小大约为10毫米。agstudy提到的“魔法”数字实际上与以下数字相差不到1%:
as.numeric(grid::convertX(grid::unit(1, "points"), "mm"))
#[1] 0.3514598
0.352777778/.Last.value
#[1] 1.00375

我曾以为尺寸单位是毫米。http://groups.google.com/group/ggplot2-dev/tree/browse_frm/thread/37ba1aaaf8e22b38/a2c142da58418570?hide_quotes=no&pli=1 我想知道为什么这个神奇的数字不是0.3514598。 - user1609452
也许是 Hadley 的设备尺寸比例的问题。我正在使用一台六年前的 Mac。 - IRTFM
我想重复一下我对上面张贴者的问题:鉴于这些信息,您是否推荐关于指定点大小的任何良好实践?我经常发现自己在试错中浪费时间。 - Heisenberg
我猜如果你想指定点数,就把你想要的点数乘以魔法数字。 - user1609452

4

?aes_linetype_size_shape 开始

# Size examples
# Should be specified with a numerical value (in millimetres),
# or from a variable source

ggsave中的heightwidth?par中的par("din")相关。

din

  R.O.; the device dimensions, (width, height), in inches. See also dev.size,
  which is updated immediately when an on-screen device windows is re-sized.

我猜测中的size是以毫米为单位的,而中的heightwidth则是以英寸为单位的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接