Геопространственное картографирование с использованием огранки ggplot в R? - PullRequest
3 голосов
/ 04 февраля 2020

У меня есть Watershed, который имеет 33 subbasins. Я не смог придумать код для рисования воспроизводимого shapefile для водосбора, поэтому я прилагаю свой Shapefile . У меня есть four models, которые генерируют Evapotranspiration (ET) данные за годы 2005-2008. Я хотел бы сравнить четыре модели продуктов каждого года, используя функциональность ggplot faceting. Я попробовал несколько вещей (см. Мой пример кода), но не смог. Я был бы признателен за продвижение вперед.

library(sf)
library(tidyverse)

shape <- read_sf(dsn = ".", layer = "Watershed")


ETM1 = data.frame(Subbasin = 1:33, Yr2005 = runif(33, 500,700), Yr2006 = runif(33, 600,750), Yr2007 = runif(33, 450,750),
                  Yr2008 = runif(33, 550,800), Model = rep("M1", 33))

ETM2 = data.frame(Subbasin = 1:33, Yr2005 = runif(33, 600,750), Yr2006 = runif(33, 550,750), Yr2007 = runif(33, 600,750),
                  Yr2008 = runif(33, 700,800), Model = rep("M2", 33))

ETM3 = data.frame(Subbasin = 1:33, Yr2005 = runif(33, 500,750), Yr2006 = runif(33, 650,750), Yr2007 = runif(33, 700,750),
                  Yr2008 = runif(33, 500,800), Model = rep("M3", 33))

ETM4 = data.frame(Subbasin = 1:33, Yr2005 = runif(33, 400,750), Yr2006 = runif(33, 450,750), Yr2007 = runif(33, 300,750),
                  Yr2008 = runif(33, 400,800), Model = rep("M4", 33))

ETData = rbind(ETM1,ETM2,ETM3,ETM4)
Combine = gather(ETData, key = "Variable", value = "Value", -c("Model","Subbasin"))

SpData = merge(shape, Combine, by='Subbasin')

ggplot() + 
  geom_polygon(SpData, aes(x = Lat, y = Long_, fill = Value))+
  facet_wrap(~Model, nrow = 4, ncol = 4)

вот изображение моего шейп-файла, которое я рисую, используя plot(shape$geometry) enter image description here

Вот примерное figure, который я хотел бы построить, хотя в нем всего 3 строки. enter image description here

Я сделал фигуру (нарисованную от руки), которая отражает мою конечную цель - каждая овальная форма (своего рода) представляет мой Catchment shapefile с делением как subbasins. Я прошу прощения за мой плохой рисунок. enter image description here

1 Ответ

3 голосов
/ 04 февраля 2020

Вы были довольно близки к решению. Ваши окончательные данные содержат все, чтобы получить ваш сюжет.

По сути, вы можете использовать facet_grid для разделения переменных "Год" и "Модель" и geom_sf, который будет использовать столбец "геометрия" вашего набора данных для построения фигуры (дополнительная информация здесь: https://ggplot2.tidyverse.org/reference/ggsf.html). Передача значения в качестве заполнения в aes сделает остальное.

Здесь я использовал scale_fill_gradient, чтобы установить цвет, и несколько функций, чтобы приблизить график к желаемому графику:

library(sf)
library(tidyverse)

ggplot() +
  geom_sf(data = SpData, aes(fill = Value))+
  facet_grid(Variable~Model)+
  scale_fill_gradient(name =  "Evapotranspiration (ET)", low = "green", high = "red",
                      limits = c(300,900), 
                      breaks = c(300, 500, 700, 900))+
  theme_void()+
  theme(legend.position = "bottom")

enter image description here

...