使用 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
您的代码存在一些问题。
dev.new()
打开一个设备,但不一定是 pdf 设备:如果需要,最好明确打开该设备。
unlist(rates[2])
在这种情况下可能会起作用,但这不是从数据框中提取列的常用方法。 rates[[2]]
或 rates[,2]
更常见。但是甚至不需要提取列:使用 data
参数代替 plot
和 lm
。
你的子集设置是错误的。我不确定它会做什么,但几乎可以肯定不是你想要的。最好对 data
参数中使用的数据帧进行子集化。
plot
有两种常见形式:plot(x, y)
或plot(y ~ x)
。您似乎使用了 plot(y, x)
来交换轴。只有 plot(y ~ x)
形式适用于 data
参数,所以我会使用它。也符合lm()
,另一个优点
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()
}
我正在根据数据文件第一列中的每个唯一值创建散点图。散点图创建得很好,但我想为这些图表中的每一个添加一条回归线。使用我目前的方法,我只在其中一个图表 (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
您的代码存在一些问题。
dev.new()
打开一个设备,但不一定是 pdf 设备:如果需要,最好明确打开该设备。unlist(rates[2])
在这种情况下可能会起作用,但这不是从数据框中提取列的常用方法。rates[[2]]
或rates[,2]
更常见。但是甚至不需要提取列:使用data
参数代替plot
和lm
。你的子集设置是错误的。我不确定它会做什么,但几乎可以肯定不是你想要的。最好对
data
参数中使用的数据帧进行子集化。plot
有两种常见形式:plot(x, y)
或plot(y ~ x)
。您似乎使用了plot(y, x)
来交换轴。只有plot(y ~ x)
形式适用于data
参数,所以我会使用它。也符合lm()
,另一个优点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()
}