R中相同window中的多个不同大小的图?
multiple different sized plots in same window in R?
类似的问题已经被问过很多次了,例如here and here。但是,到目前为止我看到的所有其他答案都没有真正解决我的问题。
我正在尝试在同一个 window 中绘制多个不同大小的图。我正在使用 tidygraph
对象并使用 ggraph
来创建绘图。我尝试使用 gridExtra
和 cowplots
,但是,我似乎无法让它们按我想要的方式工作。
例如,开始我创建一些数据,将它们变成 tidygraph
对象并将它们放在一个列表中,如下所示:
library(tidygraph)
library(ggraph)
library(cowplot)
library(gridExtra)
# create some data
edges <- data.frame(from = c(1,1), to = c(2,3))
edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5), to = c(2, 3, 4, 5, 6, 7))
edges2 <- data.frame(from = c(1,2,2,1), to = c(2,3,4,5))
tg <- tbl_graph(edges = edges)
tg_1 <- tbl_graph(edges = edges1)
tg_2 <- tbl_graph(edges = edges2)
myList <- list(tg, tg_1, tg_2)
然后我使用 ggraph
创建一个绘图函数并创建一个绘图列表,如下所示:
# create plotting function
plotFun <- function(List, n) {
plot <- ggraph(List, "partition") +
geom_node_tile(aes(fill = "red"), size = 0.25) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
}
# create list of all plots
allPlots <- lapply(myList, plotFun, n = length(myList))
因此,在我的示例中,我有 3 个不同的图...我试图在同一个 window 中绘制所有 3 个图,但每个图都有不同的大小。我想要的输出如下图所示...
我想做的是让一个地块“全尺寸”,第二个地块是第一个地块大小的 1/2,第三个地块是第一个地块大小的 1/4。这看起来像:
注意:图片是在 photoshop 中制作的,所以我上面提到的比例在图片中并不准确。
我在尝试解决方案时的想法是使用 gridExtra
或 cowplot
...我已经包含了一些基本尝试,但它们不起作用...它们似乎改变了列或行大小而不是实际绘图大小:
尝试的解决方案
# ATTEMPED COWPLOT SOLUTION
plot_grid(plotlist = allPlots, align = "hv", ncol = 2, rel_heights = c(1, 1/2, 1/4), rel_widths = c(1, 1/2, 1/4))
# ATTEMPED GRIDEXTRA SOLUTION
grid.arrange(
grobs = allPlots,
widths = c(1, 0.5, 1/4),
heights = c(1, 0.5, 1/4),
layout_matrix = rbind(c(1, 2, 3))
)
编辑 -- 已修复以缩小每个 OP 的第三个图表。
library(patchwork)
design <- c( # we specify the top, left, bottom, and right
area(1, 1, 4, 4), # coordinates for each of the three plots
area(1, 5, 2, 6),
area(3, 5)
)
allPlots[[1]] + allPlots[[2]] + allPlots[[3]] +
plot_layout(design = design)
类似的问题已经被问过很多次了,例如here and here。但是,到目前为止我看到的所有其他答案都没有真正解决我的问题。
我正在尝试在同一个 window 中绘制多个不同大小的图。我正在使用 tidygraph
对象并使用 ggraph
来创建绘图。我尝试使用 gridExtra
和 cowplots
,但是,我似乎无法让它们按我想要的方式工作。
例如,开始我创建一些数据,将它们变成 tidygraph
对象并将它们放在一个列表中,如下所示:
library(tidygraph)
library(ggraph)
library(cowplot)
library(gridExtra)
# create some data
edges <- data.frame(from = c(1,1), to = c(2,3))
edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5), to = c(2, 3, 4, 5, 6, 7))
edges2 <- data.frame(from = c(1,2,2,1), to = c(2,3,4,5))
tg <- tbl_graph(edges = edges)
tg_1 <- tbl_graph(edges = edges1)
tg_2 <- tbl_graph(edges = edges2)
myList <- list(tg, tg_1, tg_2)
然后我使用 ggraph
创建一个绘图函数并创建一个绘图列表,如下所示:
# create plotting function
plotFun <- function(List, n) {
plot <- ggraph(List, "partition") +
geom_node_tile(aes(fill = "red"), size = 0.25) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
}
# create list of all plots
allPlots <- lapply(myList, plotFun, n = length(myList))
因此,在我的示例中,我有 3 个不同的图...我试图在同一个 window 中绘制所有 3 个图,但每个图都有不同的大小。我想要的输出如下图所示...
我想做的是让一个地块“全尺寸”,第二个地块是第一个地块大小的 1/2,第三个地块是第一个地块大小的 1/4。这看起来像:
注意:图片是在 photoshop 中制作的,所以我上面提到的比例在图片中并不准确。
我在尝试解决方案时的想法是使用 gridExtra
或 cowplot
...我已经包含了一些基本尝试,但它们不起作用...它们似乎改变了列或行大小而不是实际绘图大小:
尝试的解决方案
# ATTEMPED COWPLOT SOLUTION
plot_grid(plotlist = allPlots, align = "hv", ncol = 2, rel_heights = c(1, 1/2, 1/4), rel_widths = c(1, 1/2, 1/4))
# ATTEMPED GRIDEXTRA SOLUTION
grid.arrange(
grobs = allPlots,
widths = c(1, 0.5, 1/4),
heights = c(1, 0.5, 1/4),
layout_matrix = rbind(c(1, 2, 3))
)
编辑 -- 已修复以缩小每个 OP 的第三个图表。
library(patchwork)
design <- c( # we specify the top, left, bottom, and right
area(1, 1, 4, 4), # coordinates for each of the three plots
area(1, 5, 2, 6),
area(3, 5)
)
allPlots[[1]] + allPlots[[2]] + allPlots[[3]] +
plot_layout(design = design)