ggplot2中PDF导出的一致图形尺寸

4

曾经有类似的问题被问到过,但我没有找到解决我的特定问题的方法。

我如何以相同的尺寸导出我的图表? 这是我的示例:

利用mpg数据集绘制散点图,并将年份分开展示在第一张图中。第二张图是相同的图表,但只使用了一个年份的数据(仅使用一个而不是两个子图)。我使用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轴元素/刻度之间的距离)保持不变,当添加更多元素(在x轴上添加更多值)时,导出的图形将变得更宽?

如果能够像GraphPad Prism那样遵循相同的逻辑就太好了,即在A4画布中央绘制图形,如果有更多的列(而且每个独立的列保持相同的宽度),那么图形会变得更大。

不确定我表达得是否清楚,希望你能理解我的意思。

非常感谢任何帮助!

祝好, Ben

1个回答

3
与此同时,我自己找到了一个解决方案,很高兴能够分享:
我发现egg包的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:

p1_fixed

p2_fixed:

p2_fixed

该过程并非完全自动化,因为仍需要为绘图面板提供宽度和高度,并且如果提供更多的x轴条目,则不会自动调整大小,但它确实有助于解决我的问题。

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