作者luenchang (luen)
看板R_Language
标题[问题] Multiple ggplot2 plots on 1 page
时间Tue Jun 13 15:22:54 2023
[问题叙述]:
先谢谢上周h大回覆关於如何画图的第2个x轴。之後我试着把code作延伸,改成给数据库
里的27个病人 (SUBJID) 每个人画一个图,并且在同一个页面排成3 x 9 (ncol=3,
nrow=9)的多图。目前我是把ggplot2的程式用for loop给每个病人生成一个plot object
,然後以他们的SUBJID 为字根将plot object命名,例如plot.017_306, plot.017_313,
plot.023_302。
我Google了几个网页及stackoverflow, 大部分多图排列是用类似以下的方法:
ridExtra::grid.arrange(plot.017_306, plot.017_313, plot.023_302, ncol=3,
nrow=1)
不过,因为plot objects 的数量多,我不想一个个地列出来。很有可能其他要绘图的数
据有更多的病人。
我接着用以下程式把所有 plot objects 放进一个list:
# Add all plot objects to a list
pattern.plot.objects <- "plot.\\d{3}_\\d{3}"
plot.list <- list(ls(pattern = pattern.plot.objects))
再想办法用这个list产生多图 :
ggpubr::ggarrange(plotlist = plot.list, ncol=3, nrow=1)
# In as_grob.default(plot) :
# Cannot convert object of class character into a grob.
cowplot::plot_grid(plotlist = plot.list, ncol=3, nrow=1)
# Warning message:
# In as_grob.default(plot) :
# Cannot convert object of class character into a grob.
gridExtra::grid.arrange(grobs= plot.list, ncol=3, nrow=1)
# Error in gList(...) : only 'grobs' allowed in "gList"
do.call(what = "grid.arrange", args = c(plot.list, ncol=3)) # Error in
gList(...) : only 'grobs' allowed in "gList"
以上每个code都产生error, 多图也没产生。我再用error message也是没找到有用的除错
程式。
不过,我不想用的方法
gridExtra::grid.arrange(plot.017_306, plot.017_313, plot.023_302, ncol=3,
nrow=1)
倒是有产生多图:
https://hackmd.io/_uploads/H1s90rHD2.png
另一个问题是,我也需要把legend放进图区里面,目前是放在图区外上方,legend内容量
大的图y轴会被挤压。不知道要如何将所有
图y轴的长度变为等长?
[程式范例]:
为了简化例子,我的程式只提供了3个病人的数据。程式贴在 Arrange multiple
ggplot2 plots on one page 这个部分,
网址为
https://hackmd.io/@Chang/adverse-events-gantt-chart
已经会ggplot2 多图的大大,先谢谢了。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.182.204.157 (澳大利亚)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1686640976.A.A58.html
1F:→ luenchang: 我把list放到for loop里面,已经可以产生多图了。程式 06/13 17:17
2F:→ luenchang: 在hackmd note里已经更新。目前的问题变成美学方面的 06/13 17:17
3F:→ luenchang: ,例如如何缩减小图之间的间距。 06/13 17:17
4F:→ luenchang: 或是能将bars在y轴上的位置往底部移动 06/13 17:21
5F:推 hohiyan: 可以说明一下要把多个不同subjid的图放在一起的目的吗? 06/14 01:17
6F:→ hohiyan: 依目的的差异,用来呈现图表的方式也不同 06/14 01:18
7F:→ hohiyan: 最简单的方法:既然变项都一样,那用 facet_wrap 就可以 06/14 01:19
8F:→ hohiyan: 想要3x3的图,那就每次抓9个subjid出来跑之类的 06/14 01:20
9F:→ hohiyan: facet_warp(~ subjid, nrow=3, scale="free") 06/14 01:22
10F:→ hohiyan: 如果目的是把跑出来的图可以一次放在一个档案给别人看 06/14 01:23
11F:→ hohiyan: 那搭配 Quarto 或 RMarkdown,在排版上也会比较容易 06/14 01:24
12F:推 Gjerry: 也可以用 patchwork 来合并图 06/18 15:31