Создание подзадачи (фасетов) с пользовательской позицией x, y для подзаговоров в ggplot2 - PullRequest
2 голосов
/ 22 апреля 2020

Как мы можем настроить положение панелей / субплота в ggplot2?

Конкретно у меня есть сгруппированный временной ряд, и я хочу создать 1 субплот за временной ряд с пользовательскими позициями субплота, не обязательно в сетка.

Функции facet_grid() или facet_wrap() не обеспечивают полную настройку положения панели, поскольку она использует сетку.

library(tidyverse)

df = data.frame(group = LETTERS[1:5],
                x = c(1,2,3,1.5,2.5),
                y =c(2,1,2,3,3),
                stringsAsFactors = F)%>%
  group_by(group)%>%
  expand_grid(time = 1:20)%>%
  ungroup()%>%
  mutate(dv = rnorm(n()))%>%
  arrange(group,time)

## plot in grid          
df%>%                  
ggplot()+
  geom_line(aes(x=time,y=dv))+
  facet_grid(~group)

## plot with custom x, y position
## Is there an equivalent of facet_custom()?             
df%>%                  
ggplot()+
  geom_line(aes(x=time,y=dv))+
  facet_custom(~group, x.subplot = x, y.subplot = y)

К вашему сведению: этот набор данных является только примером. Мои данные - это данные ЭЭГ, где каждая группа представляет электрод (до 64), и я хочу построить сигналы ЭЭГ каждого электрода в соответствии с положением электрода на головке.

1 Ответ

2 голосов
/ 22 апреля 2020

Ну, я думаю, что это больше не будет «фацетным сюжетом». Поэтому я не думаю, что есть какая-то конкретная функция c.

Но для этого вы можете использовать пакет fantasti c patchwork, в частности, вариант макета в wrap_plots.

. Как описывает автор основного пакета Томас в виньетке, Опция ниже, использующая area(), может быть немного многословной, но она даст вам полную программную c опцию для позиционирования всех ваших графиков.

library(tidyverse)
library(patchwork)

mydf <- data.frame(
  group = LETTERS[1:5],
  x = c(1, 2, 3, 1.5, 2.5),
  y = c(2, 1, 2, 3, 3),
  stringsAsFactors = F
) %>%
  group_by(group) %>%
  expand_grid(time = 1:20) %>%
  ungroup() %>%
  mutate(dv = rnorm(n())) %>%
  arrange(group, time)

## plot in grid
mylist <- 
  mydf %>% 
  split(., .$group) 

p_list <- 
  map(1:length(mylist), function(i){
  ggplot(mylist[[i]]) +
    geom_line(aes(x = time, y = dv)) +
    ggtitle(names(mylist)[i]) 
  }
  )

layout <- c(
  area(t = 1, l = 1, b = 2, r = 2),
  area(t = 2, l = 3, b = 3, r = 4),
  area(t = 3, l = 5, b = 4, r = 6),
  area(t = 4, l = 3, b = 5, r = 4),
  area(t = 5, l = 1, b = 6, r = 2)
)

wrap_plots(p_list, design = layout)
#> result not shown, it's the same as below

Для более программного подхода c, один вариант - создать требуемый объект "patch_area" вручную.

t = 1:5
b = t+1
l = c(1,3,5,3,1)
r = l+1

list_area <- list(t = t, b = b, l = l, r = r)

class(list_area) <- "patch_area"

wrap_plots(p_list, design = list_area)

Создано в 2020-04-22 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...