Как рисовать линии на графике в R? - PullRequest
1 голос
/ 20 февраля 2012

Мне нужно рисовать линии из данных, хранящихся в текстовом файле. Пока я могу рисовать только точки на графике, и мне бы хотелось, чтобы они были линиями (линейный график).

Вот код:

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 ]

4 голосов
/ 21 февраля 2012

По умолчанию 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-подобных языков.Если вас это смущает, вы можете сделать это без замыкания, но вам нужно будет обработать увеличение индекса и сохранение предыдущего значения точки «вручную» в цикле.

2 голосов
/ 22 февраля 2012

Среди опытных R-программистов существует сильное отвращение к использованию for-циклов, когда они действительно не нужны.Это пример безконтурного использования векторизованной функции с именем сегментов, которая принимает в качестве аргументов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...