我需要从存储在文本文件中的数据中绘制线条。 到目前为止,我只能在图表上绘制点,我想将它们作为线条(线图)。
以下是代码:
pupil_data <- read.table("C:/a1t_left_test.dat", header=T, sep="\t")
max_y <- max(pupil_data$PupilLeft)
plot(NA,NA,xlim=c(0,length(pupil_data$PupilLeft)), ylim=c(2,max_y));
for (i in 1:(length(pupil_data$PupilLeft) - 1))
{
points(i, y = pupil_data$PupilLeft[i], type = "o", col = "red", cex = 0.5, lwd = 2.0)
}
请帮我改变这行代码:
points(i, y = pupil_data$PupilLeft[i], type = "o", col = "red")
从数据中绘制线条。
以下是文件中的数据:
PupilLeft
3.553479
3.539469
3.527239
3.613131
3.649437
3.632779
3.614373
3.605981
3.595985
3.630766
3.590724
3.626535
3.62386
3.619688
3.595711
3.627841
3.623596
3.650569
3.64876
答案 0 :(得分:4)
默认情况下,R会将单个矢量绘制为y坐标,并使用x坐标的序列。因此,为了制作您所追求的情节,您只需要:
plot(pupil_data$PupilLeft, type = "o")
您尚未提供任何示例数据,但您可以使用内置的虹膜数据集看到此信息:
plot(iris[,1], type = "o")
事实上,这确实将点绘制为线条。如果您实际上获得的是没有线条的点数,那么您需要提供一个包含数据的工作示例来确定原因。
编辑:
由于循环原因,您的原始代码无效。你实际上要求R在每次循环时绘制一条连接单点与自身的线。下一次通过循环R不知道还有其他要连接的点;如果确实如此,这将打破points
的预期用途,即将点/线添加到现有的情节中。
当然,将一个点连接到自身的线并没有多大意义,所以它没有被绘制(或绘制得太小而无法看到,相同的结果)。
您的示例最容易在没有循环的情况下完成:
PupilLeft <- c(3.553479 ,3.539469 ,3.527239 ,3.613131 ,3.649437 ,3.632779 ,3.614373
,3.605981 ,3.595985 ,3.630766 ,3.590724 ,3.626535 ,3.62386 ,3.619688
,3.595711 ,3.627841 ,3.623596 ,3.650569 ,3.64876)
plot(PupilLeft, type = 'o')
如果你确实需要使用循环,那么编码就会变得更加复杂。一种方法是使用闭包:
makeaddpoint <- function(firstpoint){
## firstpoint is the y value of the first point in the series
lastpt <- firstpoint
lastptind <- 1
addpoint <- function(nextpt, ...){
pts <- rbind(c(lastptind, lastpt), c(lastptind + 1, nextpt))
points(pts, ... )
lastpt <<- nextpt
lastptind <<- lastptind + 1
}
return(addpoint)
}
myaddpoint <- makeaddpoint(PupilLeft[1])
plot(NA,NA,xlim=c(0,length(PupilLeft)), ylim=c(2,max(PupilLeft)))
for (i in 2:(length(PupilLeft)))
{
myaddpoint(PupilLeft[i], type = "o")
}
然后,您可以使用所需的任何测试将myaddpoint
调用包装在for循环中,以确定是否实际绘制该点。 makeaddpoint
返回的函数将跟踪您的绘图索引。
这是类似Lisp语言的正常编程。如果你发现它令人困惑,你可以在没有闭包的情况下做到这一点,但你需要处理递增索引并在循环中“手动”存储前一个点值。
答案 1 :(得分:2)
有经验的R编码员强烈厌恶在不需要时使用for-loops。这是一个无循环使用名为segments的矢量化函数的示例,它将4个向量作为参数:x0,y0,x1,y1
npups <-length(pupil_data$PupilLeft)
segments(1:(npups-1), pupil_data$PupilLeft[-npups], # the starting points
2:npups, pupil_data$PupilLeft[-1] ) # the ending points