使用ggplot从CSV文件创建多条线图

3

我是完全不懂ggplot(以及在某种程度上的R)的新手。我对使用ggplot可以创建的高质量图表感到惊叹,并且正在尝试学习如何使用ggplot创建简单的多行图。

不幸的是,我没有找到任何教程可以帮助我接近我想做的事情:

我有一个包含以下数据的CSV文件:

id,f1,f2,f3,f4,f5,f6
30,0.841933670833,0.842101814883,0.842759547545,1.88961562347,1.99808377527,0.841933670833
40,1.47207692205,1.48713866811,1.48717177671,1.48729643008,1.48743226992,1.48713866811
50,0.823895293045,0.900091982861,0.900710334491,0.901274168324,0.901413662472,0.901413662472

我想绘制以下内容:
  1. 将第一列(id)放在X轴上
  2. 将每个后续的“列”作为折线图,通过折线点之间的平滑来创建一个漂亮的光滑线条
  3. 为f1、f2等指定图例
  4. 指定线条颜色,并为列f2添加标记(例如十字形“+”)到折线图中。
我对ggplot非常陌生,只是将文件读入R而已。
如果能帮助我按照上述要求创建绘图,将非常有教育意义并有助于减少ggplot的学习曲线。

1个回答

3
dat <- structure(list(id = c(30L, 40L, 50L), f1 = c(0.841933670833, 
1.47207692205, 0.823895293045), f2 = c(0.842101814883, 1.48713866811, 
0.900091982861), f3 = c(0.842759547545, 1.48717177671, 0.900710334491
), f4 = c(1.88961562347, 1.48729643008, 0.901274168324), f5 = c(1.99808377527, 
1.48743226992, 0.901413662472), f6 = c(0.841933670833, 1.48713866811, 
0.901413662472)), .Names = c("id", "f1", "f2", "f3", "f4", "f5", 
"f6"), class = "data.frame", row.names = c(NA, -3L))

从这里开始我会使用melt函数。阅读?melt.data.frame获取更多信息。但简单来说,它可以将数据从“宽”格式转换为“长”格式。

library(reshape2)
dat.m <- melt(dat, id.vars='id')

> dat.m
   id variable     value
1  30       f1 0.8419337
2  40       f1 1.4720769
3  50       f1 0.8238953
4  30       f2 0.8421018
5  40       f2 1.4871387
6  50       f2 0.9000920
7  30       f3 0.8427595
8  40       f3 1.4871718
9  50       f3 0.9007103
10 30       f4 1.8896156
11 40       f4 1.4872964
12 50       f4 0.9012742
13 30       f5 1.9980838
14 40       f5 1.4874323
15 50       f5 0.9014137
16 30       f6 0.8419337
17 40       f6 1.4871387
18 50       f6 0.9014137
> 

然后按照您的喜好进行绘制:

ggplot(dat.m, aes(x=id, y=value, colour=variable)) + 
  geom_line() +
  geom_point(data=dat.m[dat.m$variable=='f2',], cex=2)

aes定义了美学元素,如x值、y值、颜色等。然后你可以添加“层”。在上一个示例中,我使用geom_line()ggplot()部分定义的内容添加了一条线,并使用geom_point添加了一个点,其中我只将它们放在f2变量上。

在下面的示例中,我使用geom_smooth()添加了一条平滑线。有关此操作的更多信息,请参见文档:?geom_smooth

ggplot(dat.m, aes(x=id, y=value, colour=variable)) + 
  geom_smooth() + 
  geom_point(data=dat.m[dat.m$variable=='f2',], shape=3)

为所有内容提供形状。在这里,我将形状放在了ggplot()的美学中。通过将它们放在这里,它们适用于所有后续的图层,而不必每次都指定它们。然而,我可以在任何后续的图层中覆盖ggplot()中提供的值:

ggplot(dat.m, aes(x=id, y=value, colour=variable, shape=variable)) + 
  geom_smooth() + 
  geom_point() +
  geom_point(data=dat, aes(x=id, y=f2, color='red'), size=10, shape=2)

然而,理解 ggplot 只是需要时间。请尝试阅读文档和在 ggplot2 网站上给出的例子进行学习。如果您的经验与我类似,在与它奋斗了几天或几周后,它终将豁然开朗。关于数据,如果您将数据指定为 dat,代码将不会改变。dat <- read.csv(...)。我不使用 data 作为变量,因为它是一个内置函数。


哎呀,谢谢你的代码。不过,正如我所担心的那样,它太难懂了。你能否注释一下代码,这样我至少可以看到在ggplot中如何实现我的问题中的“要求”1..2?最后但并非最不重要的是,在你的代码中,你手工建立了数据框。我会通过data <- read.csv(file="myfile.csv",header=TRUE,sep=",")从文件中读取数据到数据框中。为了考虑到数据是从文件中读取而不是即兴创建的,上述代码将如何更改? - Homunculus Reticulli
OP要求在点之间进行平滑插值(类似于Excel?);我不知道有什么非常简单的方法来做到这一点——geom_smooth是一个平滑器,而不是平滑插值器。(我更喜欢标准线性插值,因为我认为它更符合数据的“真实性”,尽管这显然是审美和解释的问题...) - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接