2016-03-03 3 views
1

Я рисую траектории (широта и долгота) с R рассеянным слоем из пакета openair. При группировке траекторий с опцией «group» последняя группа не получается построенной. Вот пример кода:error with scatterPlot

df = data.frame(name = c(rep('C1',10),rep('C2',10),rep('C3',10),rep('C4',10)), 
      lat = seq(1,100,2.5), 
      lon = seq(101,200,2.5)) 
scatterPlot(df ,x = "lon", y = "lat", group = "name",map = TRUE) 
scatterPlot(df ,x = "lon", y = "lat") 

Кроме того, я получаю сообщение об ошибке при попытке построить карту в фоновом режиме: «Ошибка при помощи пачке 1. аргумент я нулевой длины»

openair error scatterPlot

Thanks Ilik

ответ

3

Появляется как ошибка в коде (который основан на решетке :: xyplot). Код openair::scatterPlot выглядит вроде дилетантский:

# ------segment where `group` parameter is passed to lattice code --- 
    id <- which(names(mydata) == group) 
    names(mydata)[id] <- "MyGroupVar" 
    plotType <- if (!Args$traj) 
     c("p", "g") 
    else "n" 
    if (method == "scatter") { 
     if (missing(k)) 
      k <- NULL 
     Type <- type 
     xy.args <- list(x = myform, data = mydata, groups = mydata$MyGroupVar, 
      type = plotType, as.table = TRUE, scales = scales, 
    #---- end of extract 

Использование увернуться переименования группировки переменной, а затем с помощью $ с mydata$MyGroupVar хак. Должно быть сделано намного проще и меньше ошибок с mydata[[group]]. Предложите, чтобы вы попросили исправить ошибку.

Если вы делаете traceback() вы можете увидеть параметры, передаваемых когда генерируется ошибка пакета:

отслеживающий() 4: xyplot.formula (х = ш ~ долгота | по умолчанию, данных = список (lon = c (101, 103,5, 106, 108,5, 111, 113,5, 116, 118,5, 121, 123,5, 126, 128,5, 131, 133,5, 136, 138,5, 141, 143,5, 146, 148,5, 151, 153,5 , 156, 158,5, 161, 163,5, 166, 168,5, 171, 173,5, 176, 178,5, 181, 183,5, 186, 188,5, 191, 193,5, 196, 198,5), lat = c (1, 3,5, 6, 8,5, 11, 13,5, 16, 18,5, 21, 23,5, 26, 28,5, 31, 33,5 , 36, 38,5, 41, 43,5, 46, 48,5, 51, 53,5, 56, 58,5, 61, 63,5, 66, 68,5, 71, 73,5, 76, 78,5, 81, 83,5, 86, 88,5, 91, 93,5 , 96, 98,5), по умолчанию = c (1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), MyGroupVar = c (1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), groups = "name", type = c ("p", "g"), as.table = TRUE,

(думаю) ... Котировки вокруг «имени» могут вызывать ошибку. Он должен быть передан как некотируемое, истинное имя/символ R.

Я думаю, что вы можете получить довольно близко к тому, что вы хотите с обычной решеткой:

xyplot(data=df , lon~lat, groups = name, auto.key=TRUE, grid=TRUE) 

enter image description here

Если вам нужно настроить это, то увидеть ?xyplot.

+0

Спасибо. Для построения графика (с картой) я использовал следующий код: map ("world", ylim = c (0, 100), xlim = c (100,200), fill = TRUE, bg = "gray", col = " белый ", mar = c (1,1,1,1)) с (df, points (lon, lat, col = name, pch = '.', cex = 4)) – Ilik