R ggplot页边距-更改到轴的距离

R ggplot页边距-更改到轴的距离,r,plot,ggplot2,figure,R,Plot,Ggplot2,Figure,我正在从基本的R绘图工具切换到ggplot2,并且正在努力解决一个问题 在basic R中,您可以通过设置边距来控制到四个轴(或“框”)的距离。生成的边距是固定的,不取决于绘图内容。这使我能够为我的论文生成打印区域大小完全相同的打印,而不考虑刻度标签和轴标签的大小 在ggplot中,我声明了以下内容(最低工作示例): 图左侧的黑色箭头显示我得到的实际边距之间的差异。轴标签(y)保持在位,而y-轴的位置根据记号标签(文本表示)的大小而移动。可以通过将轴.text.y更改为例如增加大小来进一步升

我正在从基本的R绘图工具切换到ggplot2,并且正在努力解决一个问题

在basic R中,您可以通过设置边距来控制到四个轴(或“框”)的距离。生成的边距是固定的,不取决于绘图内容。这使我能够为我的论文生成打印区域大小完全相同的打印,而不考虑刻度标签和轴标签的大小

在ggplot中,我声明了以下内容(最低工作示例):

图左侧的黑色箭头显示我得到的实际边距之间的差异。轴标签(
y
)保持在位,而
y
-轴的位置根据记号标签(文本表示)的大小而移动。可以通过将轴.text.y更改为例如增加
大小来进一步升级

我所希望的是,无论画的是什么样的勾号标签,都能够控制实际的边距——在这种情况下,我可以实现不同数据集的相同大小的图形

为我的论文生成打印区域大小完全相同的打印

这可能有助于:

grid::grid.draw(egg::set_panel_size(ggplot2::qplot(1,1), width = grid::unit(3, "in")))

尽管ggplot2中有许多主题选项,但似乎没有为轴设置固定边距空间的选项(如果有,则隐藏良好)。
cowplot
软件包有一个align_plots功能,可以在一个绘图列表中对齐一个或两个轴
align_plots
返回一个列表,其中的每个组件都是原始绘图,但指定的轴已对齐。我正在使用
gridExtra
软件包中的grid.arrange函数输出两个图,以便您可以查看路线的工作方式:

library(ggplot2)
dat = data.frame(x = 1:5, y = 1e-5* (1:5) ^ 2)
p = ggplot(dat, aes(x, y)) + geom_point() + geom_line()

print(p)

p1 = p + scale_y_log10()
print(p1)

library(cowplot)
library(gridExtra)
p2 = align_plots(p, p1, align = "hv")
grid.arrange(p2[[1]], p2[[2]])

这是两个原始绘图的输出方式:

grid.arrange(p, p1)

按照in建议的方法,我最终选择了类似的方法。我使用这个方法处理了从示例ggplots生成的Grob,并且能够确定如何单独手动控制Grob的布局(至少在某种程度上)

对于示例图,生成的grob布局如下所示:

> p1$layout
   t l  b r  z clip       name
17 1 1 10 7  0   on background
1  5 3  5 3  5  off     spacer
2  6 3  6 3  7  off     axis-l
3  7 3  7 3  3  off     spacer
4  5 4  5 4  6  off     axis-t
5  6 4  6 4  1   on      panel
6  7 4  7 4  9  off     axis-b
7  5 5  5 5  4  off     spacer
8  6 5  6 5  8  off     axis-r
9  7 5  7 5  2  off     spacer
10 4 4  4 4 10  off     xlab-t
11 8 4  8 4 11  off     xlab-b
12 6 2  6 2 12  off     ylab-l
13 6 6  6 6 13  off     ylab-r
14 3 4  3 4 14  off   subtitle
15 2 4  2 4 15  off      title
16 9 4  9 4 16  off    caption
这里我们对4个轴感兴趣-
轴-l、t、b、r
。假设我们想要控制左边距-查找
轴-l
。请注意,此特定grob的布局为7x10

p1$layout[p1$layout$name == "axis-l", ]
  t l b r z clip   name
2 6 3 6 3 7  off axis-l
据我所知,这个输出意味着左轴取一个网格单元(水平方向为3,垂直方向为6)。注意索引
ind=3
。 现在,在
grob
-
widths
heights
中还有另外两个字段。让我们转到
宽度
(这似乎是
网格
单位
s的一个特定列表),并使用我们刚刚获得的索引
ind
提取宽度。在我的示例中,输出类似于

> p1$widths[3]
[1] sum(1grobwidth, 3.5pt)
我猜这是一个“运行时确定”的大小,大约是
1grobwidth
加上额外的3.5pt。现在我们可以用另一个单位来替换这个值(我测试了非常简单的东西,比如厘米或点),例如
p1$widths[3]=单位(4,“cm”)
。到目前为止,我能够确认,若你们为两个不同绘图的左轴指定相等的“宽度”,你们将得到相同的边距

浏览
$layout
表可能会提供控制打印布局的其他方法(例如,查看
$layout$name==“panel”
以更改打印区域大小)

> p1$widths[3]
[1] sum(1grobwidth, 3.5pt)