R 调整ggplot2中镶嵌面栅格/镶嵌面环绕中嵌板的相对空间

R 调整ggplot2中镶嵌面栅格/镶嵌面环绕中嵌板的相对空间,r,ggplot2,facet,R,Ggplot2,Facet,是否有方法更改镶嵌面_栅格或镶嵌面_包裹中各个镶嵌面y轴的高度/长度 比如说, library(ggplot2) ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + geom_line() + facet_grid(variable~., scales = "free_y") + theme(strip.background = elem

是否有方法更改
镶嵌面_栅格
镶嵌面_包裹
中各个镶嵌面y轴的高度/长度

比如说,

library(ggplot2)
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) +
    geom_line() +
    facet_grid(variable~., scales = "free_y") +
    theme(strip.background = element_blank())

在上面的图中,我希望pop时间序列的y轴高度/长度是uempmed y轴长度(2:1)的两倍,而不管这两个时间序列具有不同的y轴比例

就像Kohske在这里所做的一样,在ggplot2的更旧版本中,ggplot>=2.0.0不起作用:

我知道我可以在
facet\u grid
中指定参数
space=“free”
,但我认为该参数不能用于设置2:1的y轴比率


我也不想使用“grid.arrange type”解决方案来排列单独创建的ggplots(在这里我可以制作两个具有不同y轴长度的单独的plots),因为我希望在这一个
facet\u wrap
plots中使用Shiny的交互式ggplot2功能(例如,一个带有画笔的交互式发光面示例位于页面的一半:)。

有多个选项

使用
facets
,您可以使用
facet_grid(…,space='free_y')
将每行的高度调整为y刻度的长度。但是,在您的数据集中,最底层的行被最小化为一行(0-25对200000-320000)

打印/打印ggplot2对象时,首先将其转换为
gtable
对象。将打印保存为
p
,我们可以调用
ggplotGrob
获取gtable对象。这是一个单向过程;一旦转换,就无法将gtable转换回ggplot2对象

(g <- ggplotGrob(p))
TableGrob (12 x 8) "layout": 18 grobs
    z         cells       name                                    grob
1   0 ( 1-12, 1- 8) background        rect[plot.background..rect.3766]
2   1 ( 6- 6, 4- 4)  panel-1-1               gTree[panel-1.gTree.3696]
3   1 ( 8- 8, 4- 4)  panel-1-2               gTree[panel-2.gTree.3711]
4   3 ( 5- 5, 4- 4)   axis-t-1                          zeroGrob[NULL]
5   3 ( 9- 9, 4- 4)   axis-b-1    absoluteGrob[GRID.absoluteGrob.3725]
6   3 ( 6- 6, 3- 3)   axis-l-1    absoluteGrob[GRID.absoluteGrob.3733]
7   3 ( 8- 8, 3- 3)   axis-l-2    absoluteGrob[GRID.absoluteGrob.3741]
8   3 ( 6- 6, 6- 6)   axis-r-1                          zeroGrob[NULL]
9   3 ( 8- 8, 6- 6)   axis-r-2                          zeroGrob[NULL]
10  2 ( 6- 6, 5- 5)  strip-r-1                           gtable[strip]
11  2 ( 8- 8, 5- 5)  strip-r-2                           gtable[strip]
12  4 ( 4- 4, 4- 4)     xlab-t                          zeroGrob[NULL]
13  5 (10-10, 4- 4)     xlab-b titleGrob[axis.title.x..titleGrob.3714]
14  6 ( 6- 8, 2- 2)     ylab-l titleGrob[axis.title.y..titleGrob.3717]
15  7 ( 6- 8, 7- 7)     ylab-r                          zeroGrob[NULL]
16  8 ( 3- 3, 4- 4)   subtitle  zeroGrob[plot.subtitle..zeroGrob.3763]
17  9 ( 2- 2, 4- 4)      title     zeroGrob[plot.title..zeroGrob.3762]
18 10 (11-11, 4- 4)    caption   zeroGrob[plot.caption..zeroGrob.3764]
将“panel-1-1”和“panel-1-2”的坐标与这些高度相匹配,您会发现第6个和第8个元素都是
1null
。您可以将它们更改为任何单位,cm、in、pt等。
1null
只是其他元素之后的剩余部分,并在它们之间进行分割。因此,我们可以将第6个高度更改为
2null
(注意使用双括号):

>g$heights[[6]]网格绘制(g)

你有没有找到解决问题的方法?我问的问题和你的问题完全一样。当你有3个网格,并且你想要它们的比例(2,1,1)时该怎么办。使用grid_extra和heights参数很容易,但它们没有很好地垂直对齐。幸运的是,现在还没有。也许有办法做到这一点,特别是在过去一年左右对ggplot2进行了更新,但我不知道。我想它可能仍然需要在ggplot2源代码中实现,我一点也不熟悉ar with.谢谢,我知道这种绘制ggplots的方法(我在问题中提到了
网格.arrange
类型解决方案).但我不认为这实际上回答了我的具体问题…我希望最终能够在facet_wrap中调整y轴,这样我就可以在Shiny中使用交互式ggplot2图表…请参见我在问题中的rstudio链接中带有
facet_wrap
的刷点示例。我甚至不知道这样的情况可能发生使用
grob
sIt不清楚brushedPoints是如何工作的;我的猜测是,它不识别绘图上的各个点,而是外推所涵盖的x和y坐标,并从给定的data.frame返回区域内的任何点。请注意,函数没有从ggplot读取data.frame对象,但必须显式指定它;此外,您必须指定正在使用的面。如果您尝试以尝试的方式组合这两个函数,您将有大量的工作要做;请尝试使用两个单独的输出绘图小工具。
> g$heights
 [1] 5pt                 0cm                 0cm                 0cm                 0cm                 1null               5pt                 1null               0.396281911581569cm 1grobheight        
[11] 0cm                 5pt    
> g$heights[[6]] <- unit(2, 'null')
> grid.draw(g)