facet_grid с несколькими цветами линий - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий кадр данных, полученный в результате моделирования ODE с различными наборами параметров, например,

df <- data.frame(t = rep(seq(0,4), 4),
                 x1 = c(1.2*seq(1,5), 1.3*seq(1,5), 1.4*seq(1,5), 1.5*seq(1,5)),
                 x2 = c(0.2*seq(1,5), 0.3*seq(1,5), 0.4*seq(1,5), 0.5*seq(1,5)),
                 a = rep(c(rep(1, 5), rep(2,5)), 2),
                 b = c(rep(1, 10), rep(2,10))
)

Теперь я хотел бы иметь facet_grid с x1 и x2 сверху и a и b справа, где значения a и b определяют цвет линии.

Я пытался

df.1 <- df %>%
  gather(x, xval, -t, -a, -b) %>%
  gather(p, pval, -t, -x, -xval) %>%
  distinct()

df.1$pval <- as.factor(df.1$pval)

ggplot(df.1, aes(t, xval)) +
  geom_line(aes(colour = pval)) +
  facet_grid(p~x)

и

dm.1 <- melt(df[, c("t", "x1", "x2")], id = 't')
colnames(dm.1) <- c("t", "x", "xval")
dm.2 <- melt(df[, c("t", "a", "b")], id = 't')
colnames(dm.2) <- c("t", "p", "pval")
dm <- merge(dm.1, dm.2)

dm$pval <- as.factor(dm$pval)
ggplot(dm, aes(t, xval)) +
  geom_line(aes(colour = pval)) +
  facet_grid(p~x)

Но оба не дают желаемого результата. Любая подсказка будет принята с благодарностью.

Edit: желаемый результат будет иметь две линии в каждом фасете, аналогично моему первому решению, но правильные, то есть прямые линии, а не зигзагообразные линии, которые в результате.

1 Ответ

0 голосов
/ 09 мая 2018

Проблема, которая вызывает зигзагообразные графики, которые вы получаете, состоит в том, что существует несколько повторов одних и тех же комбинаций p и x, но нет способа отделить одно от другого. Итак, вы получите первый сюжет ниже:

library(tidyverse)

df <- data.frame(t = rep(seq(0,4), 4),
                                 x1 = c(1.2*seq(1,5), 1.3*seq(1,5), 1.4*seq(1,5), 1.5*seq(1,5)),
                                 x2 = c(0.2*seq(1,5), 0.3*seq(1,5), 0.4*seq(1,5), 0.5*seq(1,5)),
                                 a = rep(c(rep(1, 5), rep(2,5)), 2),
                                 b = c(rep(1, 10), rep(2,10))
)

df_long <- df %>%
    gather(key = x, value = xval, x1, x2) %>%
    gather(key = p, value = pval, a, b) %>%
    mutate(pval = as.factor(pval))

df_long %>%
    ggplot(aes(x = t, y = xval)) +
        geom_line(aes(color = pval)) +
        facet_grid(p ~ x)

Здесь вы можете увидеть, как это выглядит, когда я фильтрую для конкретной пары значений x, p. Это просто будет многократно помещать данные в одно и то же значение t, вместо того, чтобы знать, как сделать отдельные строки.

df_long %>%
    filter(x == "x1", p == "a") %>%
    head()
#>   t  x xval p pval
#> 1 0 x1  1.2 a    1
#> 2 1 x1  2.4 a    1
#> 3 2 x1  3.6 a    1
#> 4 3 x1  4.8 a    1
#> 5 4 x1  6.0 a    1
#> 6 0 x1  1.3 a    2

Вместо этого перед сбором вы можете создать идентификатор для каждой комбинации a и b и использовать его в качестве переменной группировки в aes. Возможно, есть и другие способы сделать это, но простой это просто interaction(a, b), который даст идентификаторы, похожие на 1.1, 1.2, 2.1, 2.2 и т. Д. Затем добавьте group = id внутри вашего aes, чтобы сделать отдельные строки.

df_long_id <- df %>%
    mutate(id = interaction(a, b)) %>%
    gather(key = x, value = xval, x1, x2) %>%
    gather(key = p, value = pval, a, b) %>%
    mutate(pval = as.factor(pval))

df_long_id %>%
    ggplot(aes(x = t, y = xval, group = id)) +
    geom_line(aes(color = pval)) +
    facet_grid(p ~ x)

Создано в 2018-05-09 пакетом Представить (v0.2.0).

...