【问题标题】:ggplot margins - change distance to axisggplot margins - 改变轴的距离
【发布时间】:2018-02-03 00:08:40
【问题描述】:

我正在从基本的 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())

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

无论绘制什么刻度标签,我都希望能够控制实际边距 - 在这种情况下,我可以实现不同数据集的相同大小的图形。

【问题讨论】:

    标签: r plot ggplot2 figure


    【解决方案1】:

    虽然 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)
    

    【讨论】:

      【解决方案2】:

      按照Stewart Rossthis message 中建议的方法,我最终得到了类似的thread。我使用 this 方法从我的示例 ggplots 生成的 grobs 进行了玩弄 - 并且能够确定如何单独手动控制 grobs 的布局(至少在某种程度上)。

      对于示例图,生成的 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(这似乎是gridunits 的特定列表)并使用我们刚刚获得的索引ind 获取宽度。在我的示例中,输出类似于

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

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

      探索$layout 表可能会提供其他控制绘图布局的方法(例如查看$layout$name == "panel" 以更改绘图区域大小)。

      【讨论】:

        【解决方案3】:

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

        这可能会有所帮助:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          相关资源
          最近更新 更多