导出具有精确大小和字体大小的图形

Pha*_*yde 9 svg r ggplot2

我需要从 R 导出图形以用于不同的出版物格式,即科学海报、Journal Articel、Powerpoint 演示文稿。只要我不知道使用 R-Markdown 和 Latex 或 Sweave 来制作 pdf 幻灯片,我就需要使用 Microsoft 应用程序。

我用 ggplot2 在 R 中做图形。

我的 MWE

df1 <- expand.grid(Year = c(2000, 2010),
                   Treat = c("TreatA","TreatB"),
                   Location = c("Berlin", "Munich", "Kansas", "Paris"),
                   rep = c(1,2,3,4,5,6,7,8,9,10))
df1 <- cbind(df1,
             Var1 = runif(160, -10,25) + rnorm(160,8,4))
Run Code Online (Sandbox Code Playgroud)

我的图形代码:

p1 <- ggplot(aes(y = Var1, x = Treat,  na.rm=TRUE, fill=Location), data = df1) +
  stat_boxplot(geom ='errorbar', width= 0.5) +
  geom_boxplot(outlier.shape = 1, outlier.size = 2, linetype="solid", size = 1) +
  facet_grid( Year ~ Location) + 
  scale_y_continuous(limits=c(-20,60))  +
  scale_fill_manual(values=c("#E69F00", "#009E73", "#0072B2", "#D55E00")) +
  ylab("Magic Skills") +
  xlab("Magic Juice") +
  theme(text=element_text(family="Arial", size=18),
        axis.text.x = element_text(angle = 30, hjust = 1),
        line=element_line(size=1),
        rect=element_rect(colour="red", size=1),
        panel.background=element_rect(colour="black",fill="white", size=1),
        strip.background=element_rect(colour="dark grey", fill="black"),
        strip.text=element_text(face="bold", colour="white"),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        legend.position="none");p1
Run Code Online (Sandbox Code Playgroud)

我如何保存图表:

ggsave(p1, file="Results/Figures/Abb2_Boxplots_LarvenPuppen2.svg", width=35, height=20, units = "cm", dpi=500) 
Run Code Online (Sandbox Code Playgroud)

我为整个图形设置了“theme(text=element_text(family="Arial", size=18)”的字体大小。在ggsave期间我调整了高度和宽度,海报的高度应该是20厘米,宽度是35 cm. 我保存在 .svg 中,因为我对图表的质量有了最好的体验,而且我可以随时在 Inkscape 中编辑任何东西,太棒了!

到目前为止一切顺利,然而,在从 Inkscape 导出图形(未经编辑!)为 .png 之后,文本绝不是 18 pt,稍后在 powerpoint-poster 中。它甚至不是 20 x 35 厘米,我发现在保存和导出过程中我松了大约 5 厘米或更多。

我猜 R 正在写,当我说 save 20x35 cm R 会这样做。在整个过程中,我的设置发生了什么变化,我该如何处理?

最好的问候,法西德

bap*_*ste 6

有几件事情需要考虑:

  • SVG 单位——注意关于用户单位的讨论,以及 pt 和 px
  • 网格图形参数以及设备如何解释它们
  • ggplot2,以及它的主题设置如何影响字体大小

这是一个说明第二点的纯网格示例,

library(grid)
g <- grobTree(rectGrob(), textGrob("test", gp=gpar(fontsize=12)))

ggplot2::ggsave("size.svg", g, width = 10, height=10, units = "in")

tmp <- readLines("size.svg")

grep("test", tmp, value = TRUE)
# "<text x='350.33' y='364.30' style='font-size: 12.00px; font-family: Arial;' textLength='19.34px' lengthAdjust='spacingAndGlyphs'>test</text>"
grep("viewBox", tmp, value = TRUE)
# "<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 720.00 720.00'>"
Run Code Online (Sandbox Code Playgroud)

所以简短的回答是 R 生成的 svg(此处为 svglite)包含看似一致的字体大小(12px),但无论 dpi 多少,10 英寸都被解释为 720px。查看来源,这个 72 因子来自 R 图形约定(通常设备遵循 pdf 设备,默认为 72DPI 分辨率。为什么这不受各种 dpi/res/pointsize 参数的影响对我来说是个谜)。

gridSVG 包绕过了通常的图形引擎系统,似乎产生了更直接的尺寸,

library(gridSVG)
gridsvg("size.svg", res = 1000, width=10, height=5)
grid.draw(g)
dev.off()

tmp <- readLines("size.svg")

grep("viewBox", tmp, value = TRUE)
# "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"10000px\" height=\"5000px\" viewBox=\"0 0 10000 5000\" version=\"1.1\">"
Run Code Online (Sandbox Code Playgroud)

虽然这次缩放了字体大小(默认 72DPI 分辨率为 12),

grep("font-size", tmp, value = TRUE)
# "<text x=\"0\" y=\"0\" id=\"GRID.text.41.1.1.text\" text-anchor=\"middle\" font-size=\"166.67\" fill=\"rgb(0,0,0)\" fill-opacity=\"1\">"                                       
Run Code Online (Sandbox Code Playgroud)

在 ggplot2 方面,由于主题元素的继承、rel()本地缩放、比例的一些内置设置,这些设置可能会或可能不会记录(并且在过去的 IIRC 中已更改),因此事情变得更加模糊。


Pau*_*eau 2

SVG 中的“18pt”与打印页面上的 18pt 不同。

CSS 样式属性中的一个点 (“pt”) 已被定义为 1/72 英寸,就像在印刷行业中一样。然而在 CSS 中,一英寸并不是现实世界中的英寸,而是 96 个“CSS 像素”。

96 的 dpi 是很久以前选择的任意值。计算机显示器不再是每英寸 96 像素(如果曾经有的话)。

如果您希望某些东西与现实世界相匹配 - 例如打印页面或屏幕上的一英寸 - 您将必须测试您的环境和输出方法,并对您的 SVG 单位应用缩放因子。或者你的转换技术。