R - использование данных шейп-файлов / SpatialPolygonsDataFrame для раскрашивания / заливки ggplots

У меня конкретный вопрос: как выбрать заливку или цвет ggplot в соответствии с данными объекта SpatialPolygonsDataFrame? Например, рассмотрим следующий sf SpatialPolygonsDataFrame:

sf <- readShapePoly("somePolygonShapeFile")

Это позволяет мне получить доступ к полю данных примера FK, например:

sf$FK            // or
sf@data$FK

Теперь я хочу подготовить простой ggplot:

p <- ggplot(sf, aes(x=long, y=lat, group=group, FK=???))

Однако я не знаю, что передать в FK в aes (). Опыт использования фреймов данных с координатной сеткой (grid.extent (...)) заставил меня подумать, что я мог бы напрямую указать FK = FK. Это не работает для объектов SpatialPolygonsDataFrame. Попытка FK = sf $ FK или FK = sf @ data $ FK не допускается, потому что:

Error: Aesthetics must either be length one, or the same length as the data

Думаю, решение тривиальное, но в данный момент я его просто не понимаю.


person Florian R. Klein    schedule 26.09.2013    source источник
comment
Возможно, посмотрите здесь: github.com/hadley/ggplot2/wiki/plotting- многоугольные шейп-файлы   -  person juba    schedule 26.09.2013
comment
@juba Я старался быть как можно ближе к коду учебника. Однако utah.points = fortify (utah, region = id) возвращает только ошибку: isTRUE(gpclibPermitStatus()) is not TRUE   -  person Florian R. Klein    schedule 26.09.2013
comment
просто введите gpclibPermit() или установите пакет rgeos. Функция gpclibPermit используется для разрешения использования gpclib, если он установлен, и gpclibPermitStatus сообщает о его состоянии. Лицензия на gpclib не является бесплатной или открытым исходным кодом и прямо запрещает коммерческое использование.   -  person rcs    schedule 26.09.2013
comment
@rcs Наконец-то суть. Я не установил gpclib и в результате не смог предоставить мне gpclibPermit. Теперь я могу укрепиться, используя регион. Надеюсь, описания руководства (ссылка) теперь работают и для меня, так что я могу легко перенести содержимое поля данных шейп-файла в фрейм данных. Благодарим вас за четкое указание требований!   -  person Florian R. Klein    schedule 26.09.2013


Ответы (2)


Благодаря @juba, @rsc и @SlowLearner я узнал, что установка gpclib все еще отсутствует, чтобы можно было дать gpclibPermit. После этого укрепление sf с использованием указанного региона больше не является проблемой. Используя объяснение из ggplot2 / wiki, я могу перенести все поля данных исходного шейп-файла в удобный для печати фрейм данных. Последний, наконец, работает так, как было задумано для построения шейп-файла в R. Вот окончательный код с опущенным фактическим содержимым переменной workingDir:

require("rgdal") # requires sp, will use proj.4 if installed
require("maptools")
require("ggplot2")
require("plyr")

workingDir <- ""

sf <- readOGR(dsn=workingDir, layer="BK50_Ausschnitt005")
sf@data$id <- rownames(sf@data)
sf.points <- fortify(sf, region="id")
sf.df <- join(sf.points, sf@data, by="id")

ggplot(sf.df,aes(x=long, y=lat, fill=NFK)) + coord_equal() + geom_polygon(colour="black", size=0.1, aes(group=group))
person Florian R. Klein    schedule 26.09.2013

Во-первых, вы должны использовать функцию readOGR из библиотеки rgdal для чтения вашего шейп-файла (тогда у вас не будет проблем с gpclib). Вот пример того, как это сделать.

Во-вторых, вы пытаетесь передать объект sf в ggplot как есть? Если это так, вам нужно использовать fortify() для преобразования вашего пространственного объекта во фрейм данных. В sf@data должен быть какой-то столбец идентификации, например, ID или NAME. Так что попробуйте что-нибудь вроде:

sf.df <- fortify(df, region = "NAME")

... и используйте sf.df для построения с использованием ggplot.

person SlowLearner    schedule 26.09.2013
comment
Ваш ответ и приведенный пример помогли лучше понять контекст. Мне все еще нужно было соединить отдельные точки многоугольника с помощью ранее созданных идентификаторов многоугольника, как указано в комментарии @juba в первом посте. Тем не менее, я вам благодарен. - person Florian R. Klein; 26.09.2013