Как построить несколько последовательных графиков (пакет TraMineR), используя plot_grid () в R? - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь построить несколько графиков «объекта последовательности состояний», созданного с помощью пакета TraMineR с использованием функции plot_grid().Моя главная проблема в том, что я не могу сохранить графики, созданные с помощью функции seqplot(), в списке.Моя проблема не в , как расположить легенду или «вспомогательные» графики , а в том, как на самом деле построить последовательные диаграммы в сетке.

Я сохранил графики 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)
)

Я хочу быть относительно свободным в размещении фактических элементов, которые я хочу построить в сетке.Например, я хочу сохранить страницу, содержащую 13 таких графиков и легенду в сетке 5 x 3 - как видно из примера.Вот почему я думаю, что использование plot_grid () работает лучше, чем, например, par(mfrow = c(5,3)).Кроме того, используя par(), я получаю «Ошибка в plot.new (): слишком большие поля рисунка».

Example of plot grid

1 Ответ

3 голосов
/ 09 июля 2019

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

Конечно, чтобы получить правильные размеры, используйте, например, pdf или png устройство, как это хорошо объяснено в этом ответе .

...