热力图图层(Heatmap Layer)是 Leaflet 交互式地图里一个非常炫酷但又非常好实现的功能,尤其适合表示样点的密度、浓度或其他数值型变量的空间分布趋势。
我们可以用 leaflet.extras
包来加上热力图。它是 leaflet
的扩展包,不复杂,但加载的时候会给你一种“我很厉害”的假象。
🔥 一、安装必要包(如果你还没装)
install.packages("leaflet")
install.packages("leaflet.extras")
🧪 二、基本语法
在 leaflet()
后面加上这一句就能搞定热力图:
addHeatmap(lng = ~lon, lat = ~lat, intensity = ~SOC, blur = 20, max = 0.05, radius = 15)
-
lng
,lat
:经纬度; -
intensity
:用来做热力图强度的变量(比如你可以用 SOC,pH,粒有C 等); -
radius
:每个点的影响半径(像素); -
blur
:模糊程度; -
max
:热力图颜色最大值归一化(可调)。
💡 三、在之前的 Shiny 例子中加上热力图(上一个博客)
我们在 output$map <- renderLeaflet({...})
里,加入 addHeatmap()
,就像这样:
output$map <- renderLeaflet({
leaflet(filtered_data()) %>%
addTiles() %>%
addHeatmap(
lng = ~lon,
lat = ~lat,
intensity = ~SOC, # 假设你想看 SOC 的热力分布
blur = 20,
max = max(soil_data$SOC), # 或设为1,如果你不想归一化
radius = 20
) %>%
addCircleMarkers(
~lon, ~lat,
popup = ~paste0(
"<strong>样点ID:</strong> ", ID, "<br>",
"<strong>pH:</strong> ", pH, "<br>",
"<strong>SOC:</strong> ", SOC, "<br>"
),
color = "darkgreen",
radius = 5,
fillOpacity = 0.7
)
})
这段代码会在你的样点地图上加一层“热力云雾”,代表某个数值变量的空间强度分布,越亮的区域代表值越大。
🧨 四、想炫一点?支持多变量热图切换!
可以给用户提供下拉菜单选择热力图变量,比如:
selectInput("heat_var", "选择热力图变量", choices = c("SOC", "pH", "粒有C"))
然后 addHeatmap()
里的 intensity = ~get(input$heat_var)
。
☠️ 小提醒(不说会踩坑):
-
热力图适合连续变量,不适用于分类变量;
-
少于10个点的时候热力图会很丑,别怪它;
-
intensity 变量最好标准化一下(
scale()
)不然会有一两个极端值主宰整张图; -
加热力图后建议保留原点(点图)一起显示,否则不知道哪里是哪。