создать сетку гексагональных ячеек с использованием координат широты и долготы

Я хотел бы создать пространственную сетку с гексагональными ячейками, используя координаты WGS84 (т.е. ячейки, определенные двумя координатами X = широта и Y = долгота)

Итак, вот о чем я думал:

library(ggplot2);library(hexbin)
X<-seq(-10,20,by=0.1) # create coordinates vectors X and Y
Y<-seq(35,65,by=0.1)
z<-rnorm(301,0.5,1)
df<-as.data.frame(cbind(X,Y,z)) # create data frame with a z value for each cells (X,Y)
pl<-ggplot2(data=mat,aes(x=X,y=Y,z=z))+stat_summury_hex(fun=function(x) sum(x))
plot(pl)

Но это не дает того, что я хотел.

Итак, мой вопрос: как сделать пространственную сетку с гексагональными ячейками, используя координаты широты и долготы?

И второй вопрос: как создать сетку с центром в одной точке (которая представляла бы центроид, а не левый нижний угол, как обычно?)


person Remssssss    schedule 19.07.2014    source источник


Ответы (1)


Если я правильно понимаю, вы ищете expand.grid():

xy <- expand.grid(X=X,Y=Y)
z<-rnorm(nrow(xy),0.5,1)
df<-as.data.frame(cbind(xy,z)) # create data frame with a z value for each cells (X,Y)
head(df)
pl<-ggplot(data=df,aes(x=X,y=Y,z=z))+stat_summary_hex(fun=function(x) sum(x))
plot(pl)

введите описание изображения здесь

Что касается второго вопроса, я не уверен, но поскольку все шестиугольники имеют одинаковый размер и для их центрирования потребуется одна и та же операция, вы можете сдвинуть их равномерно, изменив соответственно X и Y. Возможно, это можно сделать и с помощью аргументов, не уверен.

[[Edit 23 июля]] второй вопрос заключался в том, как получить data.frame шестнадцатеричных координат. Пришлось немного покопаться, но вот пример:

library(hexbin)
coords <- hcell2xy( hexbin(x=X,y=Y))
head(coords)
      x        y
1 -10.0 35.00000
2  -9.5 35.86603
3  -8.5 35.86603
4  -9.0 36.73205
5  -8.0 36.73205
6  -7.5 37.59808

hcell2xy() - ключевая функция, вызываемая ggplot2, и вам может потребоваться явное указание аргумента xbins, который определяется автоматически внутри ggplot2, но, по-видимому, по умолчанию равен 30 в обоих случаях.

[[Изменить 3, чтобы включить z-уровень]] Это ответ на комментарий, в котором также запрашиваются z-уровни. Разорвано с ggplot2:::hexBin

hb <- hexbin(x=X,y=Y)
# Convert to data frame
data.frame(
        hcell2xy(hb), 
        count = hb@count, 
        density = hb@count / sum(hb@count, na.rm=TRUE)
)

Вы можете выбрать, использовать ли count или density для цветов позже, но предупреждение: они отличаются от вашей z переменной, переданной в ggplot2. Если вы хотите подвести итоги на основе какой-либо другой статистики, я предлагаю вам также изучить внутреннюю часть этих функций, чтобы увидеть, как все происходит. Я этим и занимаюсь.

person tim riffe    schedule 19.07.2014
comment
Большое спасибо, это то, что я искал. Но мне интересно, как я могу поместить шестиугольники в фрейм данных (т.е. получить тот же самый фрейм данных, что и 'df', но с координатами моих гексагональных ячеек). что я не могу обработать для выполнения анализа с другими файлами, такими как растр, фрейм данных и т. д. Итак, в принципе, как я могу получить фрейм данных из stat_summary_hex (fun = function (x) sum (x))? - person Remssssss; 20.07.2014
comment
как я сказал ранее (но одновременно с Тимриффом!), я хотел бы обрабатывать свои гексагональные ячейки как классический фрейм данных. У кого-нибудь есть решение для этого? - person Remssssss; 21.07.2014
comment
например, вы хотите df координат шести углов каждой шестнадцатеричной ячейки? - person tim riffe; 21.07.2014
comment
например, но я думаю, что более правильный способ получить координаты гекса-ячеек - это использовать широту / долготу центроида ...?! - person Remssssss; 22.07.2014
comment
@Remssssss, пожалуйста, отредактируйте, чтобы ответить. Потребовалось немного покопаться в коде, но он нашелся. Последний ответ был найден в: ?hexbin:::hcell2xy - person tim riffe; 23.07.2014
comment
Спасибо, Тим, я одобрил твой ответ. Однако как я могу получить значение z, рассчитанное с помощью функции stat_summary_hex ()? - person Remssssss; 23.07.2014