填充跨经度和纬度的渐变
Fill in a gradient across longitude and latitude
我有一个包含纬度、经度和辐射的 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')
我们可以使用 ggplot2
包中的 geom_tile
来创建一个 heatmep。
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())
因为你只提供了六个数据点,情节看起来很奇怪。下面我完成并扩展了您的示例数据集,然后使用相同的代码绘制数据。
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())
最后,由于您使用的是空间数据集,我们只需将数据转换为栅格并使用 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)
数据
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)
我有一个包含纬度、经度和辐射的 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')
我们可以使用 ggplot2
包中的 geom_tile
来创建一个 heatmep。
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())
因为你只提供了六个数据点,情节看起来很奇怪。下面我完成并扩展了您的示例数据集,然后使用相同的代码绘制数据。
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())
最后,由于您使用的是空间数据集,我们只需将数据转换为栅格并使用 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)
数据
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)