Я пытаюсь построить график некоторых данных из проекта Атлас малярии . Поэтому я посмотрел виньетку и использовал пример для начала:
if (!require("malariaAtlas")) install.packages("malariaAtlas")
shape <- getShp(ISO = "MDG", admin_level = "admin1")
raster <- getRaster(dataset_id = "Explorer__2020_Global_PfPR", shp = shape, year = 2013)
p <- autoplot(object = raster,
legend_title = "",
plot_titles = FALSE,
fill_colour_palette = "PuBu")
в результате получается следующий график:
и предупреждающее сообщение:
В geom_spatraster(data = object, use_coltab = use_coltab, ...): Игнорирование неизвестных параметров:
legend_title
,plot_titles
иfill_colour_palette
Альтернативная версия построения графиков autoplot_MAPraster
допускает некоторую настройку:
p <- autoplot_MAPraster(object = raster,
legend_title = "",
plot_titles = FALSE,
fill_colour_palette = "PuBu")
Для моего приложения мне нужно настроить графики (цвет и заголовок легенды, фигуры на растре, собственный заголовок и т. д.). Поэтому я проверил исходный код и без проблем изменил код autoplot.MAPshp , но не знаю, как заставить ggplot2::geom_raster(data = object[object$raster_name == rastername,], ggplot2::aes_string(x = "x", y = "y", fill = "z"))
работать с кодом autoplot.MAPraster. В частности, object[object$raster_name == rastername,]
, где object = raster
, я получаю ошибку:
Ошибка в h(simpleError(msg, call)) :
Ошибка при оценке аргумента «i» при выборе метода для функции «[»: [подмножество] недопустимое имя(я)
Моей целью была бы (для меня) рабочая версия исходного кода autoplot.MAPraster, которую можно было бы модифицировать.
РЕДАКТИРОВАТЬ
Для лучшего разграничения разных частей карты было бы полезно перенести ранее рассчитанные границы страны (фигуры) поверх существующего растра.
shape <- getShp(ISO = "MDG", admin_level = "admin1")
autoplot(shape)
Из кода autoplot.MAPraster что-то вроде
p <- p + geom_polygon(data = shape, aes_string(x = "long", y = "lat", group = "group"), alpha = 0, colour = "grey40")
мог бы выполнить эту работу. Для меня это приводит к массажу ошибок:
Ошибка в
geom_polygon()
: ! Проблема при расчете эстетики. Ошибка произошла на третьем уровне. Вызвано ошибкой: ! Группа объектов не найдена
Вы можете использовать ggtitle()
для основного заголовка, labs()
для названия легенды, scale_fill_gradient()
для раскрашивания карты и theme_classic()
для темы сюжета.
p + ggtitle("Some Title") +
labs(fill = "Legend Title") +
scale_fill_gradient(low = "lightgreen", high = "darkgreen") +
theme_classic()
Выход:
Не могли бы вы объяснить больше, пожалуйста? Пример, может быть.
Я отредактировал вопрос в соответствии
При работе с геопространственными данными гораздо проще относиться к ним как к таковым. Это особенно верно в случае ggplot2
, который очень хорошо обрабатывает геопространственные данные. Например, «форма» в вашем примере — это научно-фантастический объект, поэтому ее построение с использованием geom_sf()
— более надежный подход. Аналогично, «растр» — это SpatRaster, поэтому вы можете использовать tidyterra::geom_spatraster()
.
В этом реплексе используется часть примера кода из malariaAtlas GitHub . Если вам нужны разные цвета заливки, есть множество вариантов scale_fill_*()
. Я включил два варианта (один закомментирован, вы можете переключаться между ними для сравнения). Я установил цвет «формы» на «черный» для иллюстративных целей, поскольку «серый40» не виден четко, но вы можете использовать любую ggplot2
эстетику, цвета и заливки в соответствии с вашими потребностями.
library(malariaAtlas)
library(tidyterra)
shape <- getShp(ISO = "MDG", admin_level = "admin1")
raster <- getRaster(dataset_id = "Explorer__2020_Global_PfPR", shp = shape, year = 2013)
ggplot() +
geom_spatraster(data = raster) +
geom_sf(data = shape, colour = "black", fill = NA) +
ggtitle("Raw PfPR Survey points +\nModelled PfPR 2-10 in Madagascar in 2013") +
scale_fill_distiller(name = "PfPR",
palette = "RdYlBu",
na.value = "transparent") +
# scale_fill_gradient(low = "lightblue", high = "darkblue",
# na.value = "transparent") +
coord_sf(xlim = c(42.5, 51)) +
theme(plot.title = element_text(size = 10))
Настройка может быть проще с помощью базового сюжета. Для начала:
library(terra)
plot(raster)
lines(shape, col = "gray")
Есть ли способ добавить фигуру поверх растра?