Сортировать ggplot facet_wrap по цвету? - PullRequest
2 голосов
/ 18 июня 2020

Я хотел бы отсортировать по ggplot facet_wrap по цвету.

Например, в этом демонстрационном коде цвет соответствует группам A, B, C. Я хочу, чтобы все красные графики располагались рядом друг с другом, и то же самое для синего и зеленого графиков.

Я пробовал отсортировать данные по группам, но ggplot, похоже, меняет порядок при построении.

library(tidyverse)
set.seed(42)

# Generate example data frame
id <- 1:15
data <- map(id, ~rnorm(10))
date <- map(id, ~1:10)
group <- map_chr(id, ~sample(c('a','b','c'), size=1))
df <- tibble(id=id, data=data, date=date, group=group) %>% unnest(cols = c(data, date))

# Generate plot
df %>%
  arrange(group) %>%
  ggplot(mapping = aes(x=date, y=data, color=group)) +
  geom_line() +
  geom_point() +
  facet_wrap(~ id)

enter image description here

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Это может помочь:

library(tidyverse)
set.seed(42)

# Generate example data frame
id <- 1:15
data <- map(id, ~rnorm(10))
date <- map(id, ~1:10)
group <- map_chr(id, ~sample(c('a','b','c'), size=1))
df <- tibble(id=id, data=data, date=date, group=group) %>% unnest(cols = c(data, date))

df2 <- df %>% mutate(id=factor(id))%>%
  group_by(group) %>%
  mutate(N = n()) %>%
  ungroup() %>%
  mutate(id = fct_reorder(id, N))

# Generate plot
df2 %>%
  arrange(group) %>%
  ggplot(mapping = aes(x=date, y=data, color=group)) +
  geom_line() +
  geom_point() +
  facet_wrap(~ id)

enter image description here

1 голос
/ 18 июня 2020

Это был бы способ (хотя бы нужно было избавиться от двойного заголовка):

df %>%
  arrange(group) %>%
  ggplot(mapping = aes(x=date, y=data, color=group)) +
  geom_line() +
  geom_point() +
  facet_wrap(~ group + id)

enter image description here

...