【问题标题】:Plot dataframe in R in a for loop在 for 循环中绘制 R 中的数据帧
【发布时间】:2016-03-01 18:27:12
【问题描述】:

假设我有一个名为“数据”的数据框:

Sal T1  T2  T3  T4  T5  T6
29.0    4.00    NA  NA  NA  NA  NA
29.5    7.50    NA  NA  NA  NA  NA
30.0    10.40   1.50    NA  NA  NA  NA
30.5    12.50   6.00    NA  NA  NA  NA
31.0    14.50   9.00    NA  NA  NA  NA
31.5    16.25   11.50   4.00    NA  NA  NA
32.0    18.00   13.50   7.50    NA  NA  NA
32.5    19.50   15.25   10.00   1.50    NA  NA
33.0    20.90   17.00   12.20   5.55    NA  NA
33.5    22.40   18.50   14.10   8.50    NA  NA
34.0    23.60   20.00   16.05   11.00   4.0 NA
34.5    24.90   21.50   17.50   13.00   7.1 NA
35.0    NA  22.75   19.20   14.70   9.7 1.5
35.5    NA  23.90   20.50   16.50   11.9    5.5

我需要在一张图中绘制与第 1 列相关的所有列。我可以通过在初始图中添加点和线来一一完成。例如:

mydata1 = na.omit(data[1:2])
plot(mydata1)
lines(mydata1,col=1)
mydata2 = na.omit(data.frame(c(data[1]),c(data[3])))
points(mydata2, col =2)
lines(mydata2,col=2)

但这太乏味了。我正在考虑使用 for 循环一次绘制所有内容。但似乎只绘制了最后一个:

for (i in 2:ncol(data)){
  mydata = na.omit(data.frame(c(data[1]),c(data[i])))
  plot(mydata)
  lines(mydata)
}

我如何在 R 中做到这一点?感谢您的帮助。

这是最终的解决方案:

plot(0,0,xlim=c(28,37),ylim=c(0,25),type="n",ylab = "T", xlab = "Sal")

for (i in 2:ncol(data)){
  mydata = na.omit(data.frame(c(data[1]),c(data[i])))
  lines(mydata, col = i)
  legendN = colnames(data)
  legendN = legendN[2:7]
  legend("topleft", legend = legendN, col= 2:7, pch=1) # optional legend
}

【问题讨论】:

  • 也许会抛出plot() 循环之外?线和点留在循环中。
  • 不会那样工作。

标签: r plot dataframe


【解决方案1】:

你也可以融合数据并使用ggplot2

library(data.table)
library(ggplot2)
#data1 <- as in @John_West's post
dat <- data.table(data1)
melted <- melt(dat,id.vars="Sal",variable.factor=F)

> melted
     Sal variable value
 1: 29.0       T1  4.00
 2: 29.5       T1  7.50
 3: 30.0       T1 10.40
 4: 30.5       T1 12.50
 5: 31.0       T1 14.50
 6: 31.5       T1 16.25
 7: 32.0       T1 18.00
 8: 32.5       T1 19.50
 9: 33.0       T1 20.90
10: 33.5       T1 22.40
11: 34.0       T1 23.60
12: 34.5       T1 24.90
13: 35.0       T1    NA
14: 35.5       T1    NA
15: 29.0       T2    NA
16: 29.5       T2    NA
17: 30.0       T2  1.50
18: 30.5       T2  6.00
19: 31.0       T2  9.00
20: 31.5       T2 11.50
...

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

顺便说一句,这种策略也可以很容易地通过观察类型来区分数据:

ggplot(melted,aes(x=Sal,y=value,color=variable)) + geom_line()

【讨论】:

  • 谢谢!你的两个解决方案都很好,但我可以选择一个作为这个问题的答案。
【解决方案2】:

首先,我建议您将plot 放在for 循环之外,而将lines 留在循环中。

其次,您没有正确缩放轴。

1.dat:

Sal T1 T2 T3 T4 T5 T6
29.0 4.00 NA NA NA NA NA
29.5 7.50 NA NA NA NA NA
30.0 10.40 1.50 NA NA NA NA
30.5 12.50 6.00 NA NA NA NA
31.0 14.50 9.00 NA NA NA NA
31.5 16.25 11.50 4.00 NA NA NA
32.0 18.00 13.50 7.50 NA NA NA
32.5 19.50 15.25 10.00 1.50 NA NA
33.0 20.90 17.00 12.20 5.55 NA NA
33.5 22.40 18.50 14.10 8.50 NA NA
34.0 23.60 20.00 16.05 11.00 4.0 NA
34.5 24.90 21.50 17.50 13.00 7.1 NA
35.0 NA 22.75 19.20 14.70 9.7 1.5
35.5 NA 23.90 20.50 16.50 11.9 5.5

代码:

x11()
data1 <- read.table("1.dat", header=TRUE, sep = " ", check.names=FALSE, as.is=TRUE)
plot(0,0,xlim=c(28,37),ylim=c(0,25),type="n",xlab="X",ylab="Y")

for (i in 2:ncol(data1)){
mydata = na.omit(data.frame(c(data1[1]),c(data1[i])))
lines(mydata)
}
Sys.sleep(10)

【讨论】:

  • 谢谢!你的两个解决方案都很好,但我可以选择一个作为这个问题的答案。我根据您的建议粘贴了最终代码。
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2016-11-15
  • 2017-10-23
  • 1970-01-01
相关资源
最近更新 更多