【问题标题】:Plotting multiple lines from a data frame with ggplot2使用 ggplot2 从数据框中绘制多条线
【发布时间】:2014-06-18 17:08:29
【问题描述】:

我正在尝试使用 ggplot2 绘制多条线。我的数据适合如下数据框:

> rs
  time           1           2           3           4
1  200 17230622635 17280401147 17296993985 17313586822
2  400 22328386154 22456712709 22499488227 22542263745
3  600 28958840968 29186097622 29261849840 29337602058
4  800 40251281810 40650094691 40783032318 40915969945
5 1000 73705771414 74612829244 74915181854 75217534464

我想使用“时间”列作为 x 值。其他列是不同行中点的 y 值。在上面的数据中,有 4 条线,每条线由 5 个点组成。更具体地说,第一行有点 (200, 17230622635), (400, 22328386154), (600, 28958840968) 等。第二行有点 (200, 17280401147), (400, 22456712709) 等。(如果你数据格式需要进一步解释,见最后PS。)

要生成类似的数据,您可以使用以下代码:

rs = data.frame(seq(200, 1000, by=200), runif(5), runif(5), runif(5))
names(rs)=c("time", 1:3)

我遵循了一些关于堆栈溢出的示例,并尝试使用 reshape2 和 ggplot2 来绘制此图:

我首先将数据融合成“长格式”:

library('reshape2')
library('ggplot2')
melted = melt(rs, id.vars="time")

然后使用以下语句绘制数据:

ggplot() + geom_line(data=melted, aes(x="time", y="value", group="variable"))

但是,我得到了一个没有点也没有线的空图。

谁能帮我看看我的程序出了什么问题?

附:

关于数据格式

您可以想象班上有很多学生,我们有他们的几个测验的分数。每行包含一个学生的数据:第一列是测验编号,其余列是他/她的分数。对于每个学生,我们要绘制一条线来反映他/她的分数在不同测验中的变化情况,每个分数是某个学生一次测验的分数。由于有多个学生,我们想画多条线。

关于融化的数据

具体到我上面展示的数据,我从melt()函数得到的数据是:

> melted
   time variable       value
1   200        1 17230622635
2   400        1 22328386154
3   600        1 28958840968
4   800        1 40251281810
5  1000        1 73705771414
6   200        2 17280401147
7   400        2 22456712709
8   600        2 29186097622
9   800        2 40650094691
10 1000        2 74612829244
11  200        3 17296993985
12  400        3 22499488227
13  600        3 29261849840
14  800        3 40783032318
15 1000        3 74915181854
16  200        4 17313586822
17  400        4 22542263745
18  600        4 29337602058
19  800        4 40915969945
20 1000        4 75217534464

【问题讨论】:

  • 为什么需要融化?

标签: r plot ggplot2


【解决方案1】:

去掉引号:

ggplot(data=melted, aes(x=time, y=value, group=variable)) + geom_line()

请参阅:ggplot aesthetics

【讨论】:

    【解决方案2】:

    另一种选择是使用aes_string

    【讨论】:

    • 声望达到 50 后,您可以评论其他人的帖子。您可以在此处查看完整的权限列表:stackoverflow.com/help/privileges
    • 对我来说似乎几乎倒退了。 ;)
    • 我猜这是为了避免垃圾邮件和自我推销的cmets
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2021-12-10
    • 2016-08-06
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多