ggplot2 中 pdf 导出的一致绘图大小

Consistent plot size for pdf-export in ggplot2

有人问过类似的问题,但我还没有找到解决我的具体问题的方法。

如何导出相同维度的绘图?这是我的例子:

来自 mpg 数据集的散点图,在图 1 中具有分面年份。图 2 是相同的图,但只有一年的数据(一年而不是两个方面)。 我使用 ggsave() 将绘图导出为 .pdf。

library(tidyverse)

p1 <- ggplot(mpg, aes(x = displ, y = cty, color = class))+
  geom_point()+
  facet_wrap(. ~ year) 

p2 <- ggplot(filter(mpg, year == 1999), aes(x = displ, y = cty, color = class))+
  geom_point()+
  facet_wrap(. ~ year) 

ggsave(p1, filename = "p1.pdf")
ggsave(p2, filename = "p2.pdf")

结果图(在标准 pdf 导出设置上,在本例中为 8.74 x 9.02)如下所示:

p1

p2

各个绘图保持其线条粗细、字体大小等,但绘图区域或各个方面的大小不变,因此条形的宽度也会发生变化。

我明白了,我可以像这样调整 pdf 的大小:

ggsave(p1, filename = "p1_manual_size.pdf", width = 16, height = 9.02 )
ggsave(p2, filename = "p2_manual_size.pdf", width = 8.74, height = 9.02)

这是他们的样子:

p1_manual_size

p2_manual_size

这在某些情况下相当有效,但如果情节变得越来越复杂(更多方面、图例的不同位置等),维护情节会变得非常复杂(而且大多数时候是不可能的) -面积比。

所以,问题是: 是否有可能在 ggplot2 中保持绘图的这些比率,以便距离 - 例如 x 轴之间 elements/ticks - 保持不变并且添加的元素越多(x 轴上的值越多)越宽导出的剧情会变成?

如果可以遵循与 GraphPad Prism 实例相同的逻辑,那就太好了,在 A4 canvas 的中间绘制绘图,如果有更多,它们会变得更大让我们说列(并且各个列保持相同的宽度)。

不确定我是否很好地表达了这个问题,我希望你能明白我的意思。

非常感谢任何帮助!

最好的, 本

与此同时,我自己想出了一个解决方案,我很乐意分享:

我发现 egg-package 的函数 set_panel_size() 允许固定绘图的大小及其各自的方面!

library(tidyverse)
library(egg)

p1 <- ggplot(mpg, aes(x = displ, y = cty, color = class))+
  geom_point()+
  facet_wrap(. ~ year) 

p2 <- ggplot(filter(mpg, year == 1999), aes(x = displ, y = cty, color = class))+
  geom_point()+
  facet_wrap(. ~ year) 


p1_fixed <- set_panel_size(p1, width  = unit(3, "cm"),
                               height = unit(5, "cm"))

p2_fixed <- set_panel_size(p2, width  = unit(3, "cm"),
                               height = unit(5, "cm"))

ggsave(p1_fixed, filename = "p1_fixed.pdf", height = 30, width = 21, units = "cm"))
ggsave(p1_fixed, filename = "p1_fixed.pdf", height = 30, width = 21, units = "cm"))

结果输出如下所示:

p1_fixed:

p2_fixed:

这个过程不是完全自动化的,因为它仍然需要为绘图面板提供宽度和高度,如果提供更多的 x 轴条目,它不会自动调整,但它确实帮助解决了我的问题。