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 轴条目,它不会自动调整,但它确实帮助解决了我的问题。
有人问过类似的问题,但我还没有找到解决我的具体问题的方法。
如何导出相同维度的绘图?这是我的例子:
来自 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 轴条目,它不会自动调整,但它确实帮助解决了我的问题。