【问题标题】:facet_grid with multiple line colours具有多种线条颜色的 facet_grid
【发布时间】:2018-10-19 18:21:17
【问题描述】:

我有以下数据框,这些数据框来自具有不同参数集的 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)

但两者都没有给出预期的结果。任何提示将不胜感激。

编辑:期望的结果是在每个方面有两条线,类似于我的第一个解决方案,但正确的线,即直线而不是产生的之字形线。

【问题讨论】:

  • 我正在运行您的代码并进行了一些修改,但您想要的结果是什么?
  • @camille 我已将其添加到帖子的末尾

标签: r ggplot2 tidyverse melt


【解决方案1】:

导致您得到的锯齿形图的问题是px 的相同组合有多个重复,但没有办法区分一个与另一个。所以你得到下面的第一个图:

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)

当我过滤一对特定的 xp 值时,您可以在这里看到它的样子。这只会将数据重复放置在 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

相反,在收集之前,您可以为ab 的每个组合创建一个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 年 5 月 9 日创建。

【讨论】:

  • 谢谢!可能我说得不够清楚。在 facet x1,a 中应该只有 a 不同但 b 相同的两条线
  • 我认为在这种情况下,在弄清楚如何塑造数据时,您需要做一些不同的事情,因为当我为 (x1, a) 过滤您的长形数据时,有 20 行,即足以制作 4 行,而不是 2 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多