R:绘制多条曲线与一个变量,但有 4 个因素

R: plot multiple curves vs one var but for 4 factors

我有一个 DF 看起来像:

   id     app  vac dac
1:  1 1000802  579 455
2:  1 1000803 1284 918
3:  1 1000807   68  66
4:  1 1000809 1470 903
5:  2 1000802  407 188
6:  2 1000803  365 364
7:  2 1000807  938 116
8:  2 1000809  699 570

我需要在相同的 canvas 上为每个 app 绘制 vacdac 作为 id 的函数。我知道如何通过使用 melt 和使用 ggplot 进行批量绘图来仅对一个 app 执行此操作。但是我不知道如何为任意数量的 factors/levels 做这件事。

在此示例中,4 app 共有 8 条曲线。有什么想法吗? 这是测试的数据框。谢谢!!

df = structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), app = c(1000802, 
                                                               1000803, 1000807, 1000809, 1000802, 1000803, 1000807, 1000809
), vac = c(579, 1284, 68, 1470, 407, 365, 938, 699), dac = c(455, 
                                                             918, 66, 903, 188, 364, 116, 570)), .Names = c("id", "app", "vac", 
                                                                                                            "dac"), class = c("data.table", "data.frame"), row.names = c(NA, 
                                                                                                                                                                         -8L))

编辑:对轴的一些说明, x axis = idy axis = vacdac 的值对于 4 个 app 因素中的每一个

我不确定,我理解你的问题,但我会做类似

ggplot(df,aes(vac,app,group=app)) + geom_point(aes(color=factor(app)))

有点不清楚你在找什么,但如果你正在寻找一条连接 vacdac 值的直线,这里有一个使用 dplyr 的解决方案和 tidyr.

首先,gather vacdac 列(这与 reshape2::melt 类似,但语法更容易理解)。然后,将 variable(其中有 "vac" 和 "dac")设置为您的 x-locations,value(来自旧的 vacdac 列)作为你的 y,然后将 appid 映射到美学(这里,colorlinetype)。设置 group 以确保它连接正确的点对,并添加 geom_line:

df %>%
  gather(variable, value, vac, dac) %>%
  ggplot(aes(x = variable
             , y = value
             , color = factor(app)
             , linetype = factor(id)
             , group = paste(app, id))) +
  geom_line()

给予

鉴于问题编辑,您可以像这样更改轴:

df %>%
  gather(variable, value, vac, dac) %>%
  ggplot(aes(x = id
             , y = value
             , color = factor(app)
             , linetype = variable
             , group = paste(app, variable))) +
  geom_line()

给予