gpt4 book ai didi

r - 如何在 R 中的网格上的特定位置排列图?

转载 作者:行者123 更新时间:2023-12-05 01:55:41 27 4
gpt4 key购买 nike

我正在尝试使用特定坐标将多个图(不同大小)绘制到网格上。为此,我正在使用 treemap 创建树状图包以获取坐标,然后使用这些坐标,我尝试放置我的个人地 block 。希望我下面的例子能更好地解释我的问题。

首先,我创建了一些条形图,然后创建了一个树状图,如下所示:

library(ggplot2)
library(treemap)
#create data
df <- data.frame(var1 = c("A", "B", "C"),
var2 = runif(3),
var3 = runif(3),
var4 = runif(3),
size = c(10, 5, 3),
labels = c(1:3))
# Basic barplot
p1 <- ggplot(data=df, aes(x=var1, y=var2)) +
geom_bar(stat="identity")
p2 <- ggplot(data=df, aes(x=var1, y=var3)) +
geom_bar(stat="identity")
p3 <- ggplot(data=df, aes(x=var1, y=var4)) +
geom_bar(stat="identity")

#create treemap
tm <- treemap(df,
index = "labels",
vSize = "size",
palette = "Set2")

如果我们看一下树状图对象 tm ,我们可以看到它提供了如下所示树状图的坐标,其中 x0 , y0 , w , 和 h是坐标。

> tm$tm
labels vSize vColor stdErr vColorValue level x0 y0 w h color
1 1 10 1 10 NA 1 0.0000000 0.000 0.5555556 1.000 #66C2A5
2 2 5 1 5 NA 1 0.5555556 0.375 0.4444444 0.625 #FC8D62
3 3 3 1 3 NA 1 0.5555556 0.000 0.4444444 0.375 #8DA0CB

treemap

所以,我想做的是采用我的三个条形图 p1 , p2 , 和 p3并将它们放入 TreeMap 中,以便 p1将就位1树状图.... p2将就位2等等……

为了清楚起见,我想要的结果看起来像这样: treemap of plots

关于我如何做到这一点有什么建议吗?我尝试使用 patchwork包但遇到了情节重叠的问题......但我愿意接受使用任何包的建议(例如 gridExtra 或只是 ggplot )

编辑根据彼得在下面给出的关于 patchwork 的回答,稍微澄清一下。包,我无法手动输入坐标作为绘图布局(我最初是在area中使用patchwork函数并将树状图的坐标输入到area函数中)。但是,正如下面评论中提到的,如果我有很多条形图,并且树状图的大小和形状发生变化,那么我就无法手动输入布局值。我正在尝试找到一种自动化流程的方法

最佳答案

这需要一些算法,并不完美,但应该是使用 patchwork 的更复杂布局选项的开始。有几个技巧可以解决:

  • treemap 根据视口(viewport)缩放其尺寸,这意味着它计算的位置取决于观察者,例如RStudio 的绘图 Pane 。相反,这不是绝对必要的,但您可能应该决定纵横比以确保框的位置符合您的要求。
  • 您需要将小数位和大小转换为整数,不是简单地乘以某个数字并四舍五入,而是找到它们的小数当量的分母并乘以它。例如,第一个框的宽度为 0.55555,即 5/9;为了得到整数,我们需要知道这个盒子应该是 5 个单位宽,总共 9 个单位。取最大宽高是任意的;关键是要得到一个不等于 1.0 的值。
  • 从不同的维度中加减 1 并不是最好的方法,但却是一种足够简单的方法来获得例如一个盒子从 1 到 5,下一个盒子从 6 到 9。
  • 地 block 的顺序不正确,但大小不对......还没弄明白为什么,但为了尝试诊断这个问题,我为每个地 block 添加了标签。
library(ggplot2)
library(treemap)
library(dplyr)

asp <- 1.25
tm <- treemap(df, index = "labels", vSize = "size", palette = "Set2", sortID = "labels",
aspRatio = asp)
denoms <- tm$tm %>%
tidyr::pivot_longer(w:h, names_to = "direction") %>%
filter(value < 1) %>%
group_by(direction) %>%
slice_max(value, n = 1) %>%
mutate(denom = MASS::fractions(value) %>%
stringr::str_extract("\\d+$") %>%
as.numeric()) %>%
select(direction, denom) %>%
tibble::deframe()
denoms
#> h w
#> 8 9
areas <- tm$tm %>%
mutate(across(c(x0, w), ~. * denoms[["w"]]),
across(c(y0, h), ~. * denoms[["h"]]),
top = y0 + 1,
left = x0 + 1,
bottom = top + h - 1,
right = left + w - 1) %>%
select(top:right) %>%
purrr::pmap(function(top, left, bottom, right) patchwork::area(top, left, bottom, right)) %>%
purrr::reduce(c)

patchwork::wrap_plots(p1, p2, p3, design = areas)

关于r - 如何在 R 中的网格上的特定位置排列图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70147677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com