Заполните градиент по долготе и широте - PullRequest
1 голос
/ 03 октября 2019

У меня есть CSV-файл с широтой, долготой и излучением. Данные выглядят как сетка и около 100 точек по всему штату. Я знаю, что существует множество вариантов отображения R, но кажется, что проще всего взять то, что у меня есть, и попытаться создать градиент от точки к точке, чтобы он выглядел как тепловая карта. Все параметры тепловых карт, которые я вижу, работают без плотности и не выглядят точными, когда я использую их с этими данными. Есть ли функция, которую я могу использовать, чтобы сгладить цвета между точками?

Вот воспроизводимый пример с гораздо меньшим диапазоном чисел:

lat    lon    value
40.5   -91.5  4513619
41.0   -95.5  4490658
41.5   -96.0  4453810
41.5   -94.5  4475373
42.0   -95.5  4432107  
42.0   -94.5  4416015   

ggplot(df, aes(x = lon, y = lat, color = value)) + 
  geom_point(size=8) + 
  coord_equal() + 
  xlab('Longitude') + 
  ylab('Latitude')

1 Ответ

1 голос
/ 04 октября 2019

Мы можем использовать geom_tile из пакета ggplot2 для создания тепловой карты.

library(ggplot2)

ggplot(df, aes(x = lon, y = lat, fill = value)) + 
  geom_tile(color = "black") +
  scale_fill_viridis_c() +
  coord_equal() + 
  xlab('Longitude') + 
  ylab('Latitude') +
  theme_bw() + 
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank())

enter image description here

Поскольку вы предоставили только шесть данныхочки, сюжет выглядит странно. Ниже я завершил и расширил ваш пример набора данных, а затем использовал тот же код для построения данных.

library(dplyr)
library(tidyr)

set.seed(123)

df2 <- df %>%
  complete(lat, lon = seq(-96, -91.5, by = 0.5)) %>%
  mutate(value = ifelse(is.na(value), sample(df$value, n(), replace = TRUE), value))

ggplot(df2, aes(x = lon, y = lat, fill = value)) + 
  geom_tile(color = "black") +
  scale_fill_viridis_c() +
  coord_equal() + 
  xlab('Longitude') + 
  ylab('Latitude') +
  theme_bw() + 
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank())

enter image description here

Наконец, поскольку вы работаетес пространственным набором данных, давайте просто конвертируем данные в растр и наносим их на график, используя пакет mapview.

library(sp)
library(sf)
library(raster)
library(mapview)

df_sp <- df2 %>%
  st_as_sf(coords = c("lon", "lat"), crs = 4326) %>%
  as("Spatial") 

r <- raster(ncol = 10, nrow = 4)
extent(r) <- extent(df_sp)
r <- rasterize(df_sp, r, df_sp$value)

mapview(r)

enter image description here

ДАННЫЕ

df <- read.table(text = "lat    lon    value
40.5   -91.5  4513619
41.0   -95.5  4490658
41.5   -96.0  4453810
41.5   -94.5  4475373
42.0   -95.5  4432107  
42.0   -94.5  4416015",
                 header = TRUE)
...