R 基于对列值的分组,在具有指定列和行的网格中显示打印列表

R 基于对列值的分组,在具有指定列和行的网格中显示打印列表,r,ggplot2,R,Ggplot2,我读过一篇文章,这篇文章似乎是我问题的“主要”部分。然而,我并不完全有我需要的,我想看看是否有任何其他的解决方案在那里 我有一个带有一些图的列表列数据框,类似于: exdata <- diamonds %>% group_by(cut) %>% nest %>% crossing(dummy = 1:3) %>% mutate(plots = map(.x = data, ~ ggplot(.x, aes(x = x, y = y)) + ge

我读过一篇文章,这篇文章似乎是我问题的“主要”部分。然而,我并不完全有我需要的,我想看看是否有任何其他的解决方案在那里

我有一个带有一些图的列表列数据框,类似于:

exdata <- diamonds %>%
  group_by(cut) %>% 
  nest %>% 
  crossing(dummy = 1:3) %>% 
  mutate(plots = map(.x = data, ~ ggplot(.x, aes(x = x, y = y)) + geom_point()))
exdata%
分组依据(切割)%>%
嵌套%>%
交叉(假人=1:3)%>%
变异(绘图=地图(.x=数据,~ggplot(.x,aes(x=x,y=y))+geom_点()
看起来像这样:

exdata
# A tibble: 15 x 4
   cut       data                  dummy plots 
   <ord>     <list>                <int> <list>
 1 Fair      <tibble [1,610 × 9]>      1 <gg>  
 2 Fair      <tibble [1,610 × 9]>      2 <gg>  
 3 Fair      <tibble [1,610 × 9]>      3 <gg>  
 4 Good      <tibble [4,906 × 9]>      1 <gg>  
 5 Good      <tibble [4,906 × 9]>      2 <gg>  
 6 Good      <tibble [4,906 × 9]>      3 <gg>  
 7 Very Good <tibble [12,082 × 9]>     1 <gg>  
 8 Very Good <tibble [12,082 × 9]>     2 <gg>  
 9 Very Good <tibble [12,082 × 9]>     3 <gg>  
10 Premium   <tibble [13,791 × 9]>     1 <gg>  
11 Premium   <tibble [13,791 × 9]>     2 <gg>  
12 Premium   <tibble [13,791 × 9]>     3 <gg>  
13 Ideal     <tibble [21,551 × 9]>     1 <gg>  
14 Ideal     <tibble [21,551 × 9]>     2 <gg>  
15 Ideal     <tibble [21,551 × 9]>     3 <gg>  
exdata
#一个tibble:15x4
切割数据虚拟图
1公平1
2公平2
3公平3
4好的1
5好的2
6好3
很好
很好
很好
10保费1
11保费2
12保费3
13理想1
14理想2
15理想3
列exdata$plots是ggplots的列表

我想以类似于基于dummys的cut和dummy列使用facet_网格的结果来绘制这些。第一列是所有“公平”的绘图,第二列是“良好”的绘图,第三列是“非常良好”的绘图,等等。每一行的标题分别为“1”、“2”和“3”。3*5的网格

我尝试了拼凑的软件包,但没有“直接”的方法。理想情况下,我会将列标题清楚地标记为相应的剪切,然后将行标记为相应的行

请注意,我的特定用例阻止我构建主数据框架,并使其以所需的方式使用facet grid,我真的被上面这样的数据框架中的列表列卡住了

[根据评论进行编辑]。 为上述段落添加更多细节,我使用一个包生成一个模型,然后绘制模型<代码>CLVTools::在我的df中的每一行上绘制(模型)。因此,绘图已经由
dplyr::mutate
区块中的现有模型生成。我不是自己创建绘图的,它们是由软件包完成的,带有一些定制,我不想与R打交道而手动复制


我如何将我的图列表列组合成一个3*5的网格,具有清晰的列和行标题,如facet_grid?

既然您有数据,为什么不直接生成图形(或者您只是有一个图列表),而不是嵌套它们?比如:

diamonds %>%
   group_by(cut) %>% 
   nest %>% 
   crossing(dummy = 1:3) %>% 
   ggplot(aes(x, y)) + 
   geom_point(data = . %>% unnest(data)) +
   facet_grid(dummy ~ cut)

然后您可以按照标准方式调整标签。

既然您有数据,为什么不直接生成图形(或者您只是有一个绘图列表),而不是嵌套它们?比如:

diamonds %>%
   group_by(cut) %>% 
   nest %>% 
   crossing(dummy = 1:3) %>% 
   ggplot(aes(x, y)) + 
   geom_point(data = . %>% unnest(data)) +
   facet_grid(dummy ~ cut)

然后,您可以按照标准方式调整标签。

这在本质上不是很有程序性,但至少可以正常工作。我的灵感来自

我们可以使用
patchwork::wrap_plots
将ggplot图放入网格中

然后我们可以使用
grid::grid.draw
手动绘制一些
textGrobs
。您可以使用
textGrob
x=
y=
参数定义最终图形上的位置。由于每个标签的位置不同,我们可以使用
purrr:walk2
组合参数集。(
walk2
类似于
map2
,但不返回任何内容。)
rot=
参数可以根据轴旋转文本

library(patchwork); library(purrr); library(grid)
wrap_plots(plotlist = exdata$plots, ncol = 3, nrow = 5) +
  plot_annotation(title = " ")
walk2(seq(0.125,0.875,length.out = 5),unique(exdata$cut),
      ~grid.draw(textGrob(.y, x = 0.01, y = .x, rot = 90)))
walk2(seq(0.165,0.835,length.out = 3),unique(exdata$dummy),
      ~grid.draw(textGrob(.y, x = .x, y = 0.98, rot = 0)))

它在本质上不是很有程序性,但至少它是有效的。我的灵感来自

我们可以使用
patchwork::wrap_plots
将ggplot图放入网格中

然后我们可以使用
grid::grid.draw
手动绘制一些
textGrobs
。您可以使用
textGrob
x=
y=
参数定义最终图形上的位置。由于每个标签的位置不同,我们可以使用
purrr:walk2
组合参数集。(
walk2
类似于
map2
,但不返回任何内容。)
rot=
参数可以根据轴旋转文本

library(patchwork); library(purrr); library(grid)
wrap_plots(plotlist = exdata$plots, ncol = 3, nrow = 5) +
  plot_annotation(title = " ")
walk2(seq(0.125,0.875,length.out = 5),unique(exdata$cut),
      ~grid.draw(textGrob(.y, x = 0.01, y = .x, rot = 90)))
walk2(seq(0.165,0.835,length.out = 3),unique(exdata$dummy),
      ~grid.draw(textGrob(.y, x = .x, y = 0.98, rot = 0)))

谢谢你的建议,但这对我不起作用(否则效率会很低)。我使用的是一个软件包CLVTools,它适合一个模型,然后生成一个绘图,例如
plot(model)
。因此,真实数据中的每一行都包含一个基于行数据段模型的绘图。做你想做的事情需要重新安装所有的模型,只是为了情节,我的现实生活列表列df相当长。啊哈,这是有道理的(我希望不是这样!)@Ianampbell在我的帖子中添加了一条编辑评论。谢谢你的建议,但这对我来说不起作用(或者效率很低)。我使用的是一个软件包CLVTools,它适合一个模型,然后生成一个绘图,例如
plot(model)
。因此,真实数据中的每一行都包含一个基于行数据段模型的绘图。做你所做的需要重新安装所有的模型,只是为了情节,而我的现实生活列表列df相当长。啊,这是有道理的(我希望不是这样!)@IanCampbell在我的帖子中添加了一条编辑评论。使用gridextra怎么样
library(gridExtra)
do.call(“grid.arrange”,c(dat$plots,ncol=5))
使用gridExtra怎么样
library(gridExtra)
do.call(“grid.arrange”,c(dat$plots,ncol=5))
谢谢这似乎很有效。为什么
seq(0.125,0.875,…
?为了以防万一,我也要把这个问题留一段时间。但是这个解决方案非常受欢迎。啊,这就是seq(0.125…)正在做的事情?选择标签的位置?OKI用一些细节更新了答案。谢谢。为什么
seq(0.125,0.875,…
?为了以防万一,我也会把这个问题留一段时间。但是这个解决方案非常受欢迎。啊,这就是seq(0.125…)正在做的事情?选择标签的位置?OKI用一些信息更新了答案