如何在R中绘制线条?

时间:2012-02-20 19:12:37

标签: r graph plot line

我需要从存储在文本文件中的数据中绘制线条。 到目前为止,我只能在图表上绘制点,我想将它们作为线条(线图)。

以下是代码:

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 

2 个答案:

答案 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