facet_grid 具有多种线条颜色
facet_grid with multiple line colours
我有以下数据框,这些数据框来自于具有不同参数集的 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)
但两者都没有给出预期的结果。任何提示将不胜感激。
编辑:期望的结果是在每个方面有两条线,类似于我的第一个解决方案,但正确的是,即直线而不是结果的之字形线。
导致您得到之字形图的问题是 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
的每个组合创建一个 ID,并将其用作 aes
中的分组变量。可能还有其他方法可以做到这一点,但一个简单的方法就是 interaction(a, b)
,它会给出类似于 1.1, 1.2, 2.1, 2.2
的 ID,等等。然后在你的 aes
中添加 group = id
制作单独的线条。
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)
由 reprex package (v0.2.0) 创建于 2018-05-09。
我有以下数据框,这些数据框来自于具有不同参数集的 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)
但两者都没有给出预期的结果。任何提示将不胜感激。
编辑:期望的结果是在每个方面有两条线,类似于我的第一个解决方案,但正确的是,即直线而不是结果的之字形线。
导致您得到之字形图的问题是 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
的每个组合创建一个 ID,并将其用作 aes
中的分组变量。可能还有其他方法可以做到这一点,但一个简单的方法就是 interaction(a, b)
,它会给出类似于 1.1, 1.2, 2.1, 2.2
的 ID,等等。然后在你的 aes
中添加 group = id
制作单独的线条。
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)
由 reprex package (v0.2.0) 创建于 2018-05-09。