Проблема, которая вызывает зигзагообразные графики, которые вы получаете, состоит в том, что существует несколько повторов одних и тех же комбинаций 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).