使用 R 在循环中创建散点图,并向图中添加回归线

Creating scatter plots in a loop with R, and adding regression lines to the plot

我正在根据数据文件第一列中的每个唯一值创建散点图。散点图创建得很好,但我想为这些图表中的每一个添加一条回归线。使用我目前的方法,我只在其中一个图表 (coat.pdf) 上收到一条回归线。这条回归线也只是 y=1 并且不遵循数据。我想要适合数据的每个图形上的回归线。我希望能够以更面向对象的方式使用 R,例如 "plot.addregression" 因为应用了这些松散的函数,我觉得我不太清楚它在访问什么。

rates = read.csv("file.txt")
for(i in unique(rates[,1])){
        dev.new()
        freq = unlist(rates[2])
        temp = unlist(rates[3])
        fMatch = freq[rates[1] == toString(i)]
        tMatch = temp[rates[1] == toString(i)]
        plot(fMatch,tMatch)#,xlab="freq",ylab="temp")
        abline(lm(fMatch~tMatch), col="red")
        file.rename("Rplots.pdf", paste(i,".pdf",sep=""))
        dev.off()
}

file.txt

clothing,freq,temp
coat,0.3,10
coat,0.9,0
coat,0.1,20
hat,0.5,20
hat,0.3,15
hat,0.1,5
scarf,0.4,30
scarf,0.2,20
scarf,0.1,10

您的代码存在一些问题。

  1. dev.new() 打开一个设备,但不一定是 pdf 设备:如果需要,最好明确打开该设备。

  2. unlist(rates[2]) 在这种情况下可能会起作用,但这不是从数据框中提取列的常用方法。 rates[[2]]rates[,2] 更常见。但是甚至不需要提取列:使用 data 参数代替 plotlm

  3. 你的子集设置是错误的。我不确定它会做什么,但几乎可以肯定不是你想要的。最好对 data 参数中使用的数据帧进行子集化。

  4. plot有两种常见形式:plot(x, y)plot(y ~ x)。您似乎使用了 plot(y, x) 来交换轴。只有 plot(y ~ x) 形式适用于 data 参数,所以我会使用它。也符合lm(),另一个优点

  5. paste0(...)paste(..., sep="") 的方便 shorthand。

所以这里的翻译可能符合您的要求:

rates = read.csv("file.txt")
for(i in unique(rates[,1])){
  pdf(file = paste0(i, ".pdf"))
  match <- rates[rates[,1] == i, ]
  plot(freq ~ temp, data = match)#,xlab="freq",ylab="temp")
  abline(lm(freq ~ temp, data = match), col="red")
  dev.off()
}