如何使用R中的plot_grid()函数绘制几个序列(TraMineR程序包)?

时间:2019-07-09 19:58:36

标签: r ggplot2 plot traminer gplots

我正在尝试绘制使用TraMineR函数通过plot_grid()包创建的“状态序列对象”的多个图。我的主要问题是,无法将使用seqplot()函数创建的绘图存储在列表中。我的问题不是关于how to position the legend or "sub"plots,而是关于如何在网格中实际绘制seqplots。

我将ggscatter绘图存储在一个列表中,然后将该列表传递给plot_grid()函数-因此,我相对确定这通常可以正常工作。我认为问题主要是由seqplot()产生的对象类型。我尝试使用as.ggplot()函数存储图表,该函数不起作用(下面的示例A)。

或多或少地使用recordPlot()函数。不过看起来不太好(下面的示例B + C)。

library(TraMineR)
library(ggplotify)

data(biofam)
biofam.lab <- c("Parent", "Left", "Married", "Left+Marr",
                "Child", "Left+Child", "Left+Marr+Child", "Divorced")
biofam.seq <- seqdef(biofam[1:600,], 10:25, labels=biofam.lab)

# Example A ---------------------------------------------------------------

# not even able to store the plot
plot.list <- list()
plot.list[[1]] <- as.ggplot(seqplot(biofam.seq, type = "I", with.legend = FALSE, sortv = "from.start"))

# Example B and C ---------------------------------------------------------

plot.list <- list()
seqplot(biofam.seq, type = "I", with.legend = FALSE, sortv = "from.start")
plot.list[[1]] <- recordPlot()
seqplot(biofam.seq, type = "I", with.legend = FALSE, sortv = "from.start")
plot.list[[2]] <- recordPlot()
seqplot(biofam.seq, type = "I", with.legend = FALSE, sortv = "from.start")
plot.list[[3]] <- recordPlot()
seqplot(biofam.seq, type = "I", with.legend = FALSE, sortv = "from.start")
plot.list[[4]] <- recordPlot()

# Example B

plot_grid(plotlist = plot.list, ncol = 2)

# Example C

plot_grid(
  plot_grid(plotlist = plot.list, ncol = 2),
  plot_grid(plotlist = plot.list, ncol = 2)
)

我想相对自由地放置要绘制在网格中的实际元素。例如,我想在5 x 3的网格中保存包含13个这样的图和图例的页面-如示例所示。这就是为什么我认为与例如par(mfrow = c(5,3))相比,plot_grid()可以更好地工作的原因。另外,使用par()会收到“ plot.new()中的错误:图形边距太大”。

Example of plot grid

1 个答案:

答案 0 :(得分:3)

seqplot在内部使用基础plot。因此,使用layout绘制多个图形会更好。您只需制作一个布局矩阵,然后绘制一个绘图即可。图例seqlegend也可以视为情节。这是一个数据示例和四个带有图例的绘图。

layout(matrix(c(1, 2, 2, 3:5), ncol=3, byrow=TRUE))
layout.show(5)  # this line is just to get the preview below where the plots will be placed

enter image description here

seqplot(biofam.seq, type="I", with.legend=FALSE, sortv="from.start")
seqlegend(biofam.seq, cex=.9, ncol=5, position="bottom")  # legend
seqplot(biofam.seq, type="I", with.legend=FALSE, sortv="from.start")
seqplot(biofam.seq, type="I", with.legend=FALSE, sortv="from.start")
seqplot(biofam.seq, type="I", with.legend=FALSE, sortv="from.start")

产量

enter image description here

当然,要获得正确的尺寸,请使用例如pdfpng设备,如this answer所述。