【问题标题】:Assign unique width to each row of a facet_grid / facet_wrap plot为 facet_grid / facet_wrap 图的每一行分配唯一的宽度
【发布时间】:2016-10-16 17:10:05
【问题描述】:

我希望在 R 中为一列的每一行分配一个自定义宽度,分面包裹图。(我知道这完全是非标准的。)

使用grid.arrange,我可以使用以下 sn-p 为 facet-wrapped like plot 的每一行分配一个唯一的高度:

group1 <- seq(1, 10, 2)
group2 <-  seq(1, 20, 3)
x = c(group1, group2)
mydf <- data.frame (X =x , Y = rnorm (length (x),5,1), 
                    groups = c(rep(1, length (group1)), rep(2, length(group2))))

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()

grid.arrange(plot1, plot2, heights=c(1,2))

上面的代码给绘图的每一行一个唯一的高度:

我想知道是否可以为绘图的每一行分配一个唯一的 width,而不是为每一行分配一个唯一的高度。任何 ggplot2 扩展都可以做到这一点吗?

【问题讨论】:

  • 您打算如何处理这些宽度?您想在每一行上添加更多图还是出于视觉目的?一个想法可能是为每个图添加边距。类似于:plot1 &lt;- ggplot(mydf, aes(X, Y)) + geom_point() +theme( plot.margin = unit(c(1,10,1,1), "lines")) 其中plot.margin 中的10 将是您的右边距,可以被认为是您的宽度。
  • 感谢@MikeyMike,本质上目标是让每个方面的 x 轴有 n 个单位,其中 n 是该方面的观察次数。每个单位都应该由一致的空间量表示,因此可视化更多观察的小平面应该具有物理上更长的 x 轴。如果我将每个面的宽度设置为相对于最大长度的长度的函数,则边距技巧可能会起作用!我要试试这个...
  • @MikeyMike 你知道在哪里可以找到关于plot.margin 可用单位的文档吗?我祈祷有一些类似于百分比的东西,但担心不会有。
  • plot.margin 的文档方面,不幸的是我不知道。但是,如果您查看?grid::unit,您可以查看单元文档。这表明您可以使用npc 单位将宽度设置为页面宽度的函数。所以npc = 0.5 表示宽度将是0.5 页面宽度。这是你要找的吗?
  • 我相信这样的事情会起作用:plot1 &lt;- ggplot(mydf, aes(X, Y)) + geom_point() +theme( plot.margin = unit(c(0.01,0.5,0.01,0.01), "npc")) 其中0.5 大致等于您的百分比。

标签: r ggplot2 plot visualization r-grid


【解决方案1】:

是的,如果您在 ggplot theme() 中使用 plot.margin 功能,这是可能的。您可以通过以下方式将每个绘图宽度设置为页面总长度的百分比:

plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme( plot.margin = unit(c(0.01,0.5,0.01,0.01), "npc"))
plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()+theme( plot.margin = unit(c(0.01,0.2,0.01,0.01), "npc"))

当我们在plot.margin 调用中使用npcs 作为我们感兴趣的单位时,我们设置的是相对于页面宽度。 0.50.2 对应于右边距。随着npc 的增加,您的地块将变得越小。

grid.arrange(plot1, plot2, heights=c(1,2))

【讨论】:

    【解决方案2】:

    作为另一种选择,您可以使用nullGrob(只占用空间的空白grob)在给定行中分配水平空间。例如:

    library(gridExtra)
    library(grid)
    
    plot1 <- ggplot(mydf, aes(X, Y)) + geom_point()
    plot2 <- ggplot(mydf, aes(X, Y)) + geom_point()
    
    grid.arrange(arrangeGrob(plot1, nullGrob(), widths=c(1,1)), 
                 plot2, heights=c(1,2))
    

    【讨论】:

    • grid.arrange(p1, p2, layout_matrix = matrix(c(1,2,NA,2), 2))
    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多