ggplot边距 - 改变到轴的距离

时间:2018-02-03 00:08:40

标签: r plot ggplot2 figure

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

在基本R中,您可以通过设置边距来控制四个轴(或“框”)中每个轴的距离。产生的利润是固定的,并不取决于您的情节。这些允许我为我的论文生成绘图,尽管刻度标签和轴标签的大小,但绘图区域大小完全相同。

在ggplot中,我发现了这个(最小的工作示例):

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)
print(p + scale_y_log10())

First figure Second figure

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

我想要的是能够控制实际的边距,无论绘制什么刻度标签 - 在这种情况下,我可以获得不同数据集的相同大小的数字。

3 个答案:

答案 0 :(得分:2)

Although there are many theme options in ggplot2, there does not appear to be an option which sets a fixed margin space for the axes (or if there is it is well hidden). The cowplot package has an align_plots function which can align one or both axes in a list of plots. align_plots returns a list, each component of which is the original plot but with the axes specified aligned. I am using the grid.arrange function from the gridExtra package to output both plots so you can see the way the alignment works:

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]])

enter image description here

This is how the two original plots would have output:

grid.arrange(p, p1)

enter image description here

答案 1 :(得分:2)

按照Stewart Ross this message中建议的方法,我最后进入类似的thread。我使用this方法在我的示例ggplots中生成了grobs,并且能够确定如何单独手动控制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轴感兴趣 - axis-l,t,b,r。假设我们想控制左边距 - 寻找axis-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 - widthsheights中还有另外两个字段。让我们转到widths(这似乎是grid的{​​{1}} s的特定列表)并选取我们刚刚获得的索引unit的宽度。在我的示例中,输出类似于

ind

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

探索p1$widths[3] = unit(4, "cm")表可能提供其他控制绘图布局的方法(例如,查看$layout以更改绘图区域大小)。

答案 2 :(得分:1)

  

为我的论文生成具有完全相同的绘图区域大小的图

这可能会有所帮助:

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

enter image description here