衔接上文,我做了一个完整的 Shiny 应用,支持下拉选择不同变量绘制热力图,并且保留了每个样点的点位、弹窗信息等交互功能,完全可以直接跑起来!
✅ 完整 Shiny 脚本:支持热力图变量切换 + 点图展示
library(shiny)
library(leaflet)
library(leaflet.extras)
library(dplyr)
# 🧪 1. 示例数据(你可以用 read.csv() 替换)
soil_data <- data.frame(
ID = paste0("S", 1:15),
lon = runif(15, 120.1, 120.3),
lat = runif(15, 31.4, 31.6),
treatment = rep(c("脱硫石膏", "生物炭", "猪粪", "鸡粪", "混合"), each = 3),
level = rep(c("低", "中", "高"), 5),
pH = round(runif(15, 7.5, 9), 2),
SOC = round(runif(15, 5, 12), 2),
粒有C = round(runif(15, 1, 4), 2),
微团聚体C = round(runif(15, 2, 6), 2)
)
# 🖼️ 2. UI 界面
ui <- fluidPage(
titlePanel("滨海盐渍土样点分布 - 可选热力图变量"),
sidebarLayout(
sidebarPanel(
selectInput("treat", "选择改良剂类型:", choices = unique(soil_data$treatment)),
selectInput("level", "选择添加量:", choices = unique(soil_data$level)),
selectInput("heat_var", "选择热力图变量:",
choices = c("SOC", "pH", "粒有C", "微团聚体C"))
),
mainPanel(
leafletOutput("map", height = 600)
)
)
)
# ⚙️ 3. 服务器逻辑
server <- function(input, output, session) {
# 根据选择过滤数据
filtered_data <- reactive({
soil_data %>%
filter(treatment == input$treat, level == input$level)
})
# 绘制地图
output$map <- renderLeaflet({
data <- filtered_data()
# 抽取热力图变量
heat_values <- data[[input$heat_var]]
heat_values <- as.numeric(heat_values)
leaflet(data) %>%
addProviderTiles("CartoDB.Positron") %>%
addHeatmap(
lng = ~lon,
lat = ~lat,
intensity = heat_values,
blur = 20,
max = max(heat_values, na.rm = TRUE),
radius = 20
) %>%
addCircleMarkers(
~lon, ~lat,
popup = ~paste0(
"<strong>样点ID:</strong> ", ID, "<br>",
"<strong>pH:</strong> ", pH, "<br>",
"<strong>SOC:</strong> ", SOC, "<br>",
"<strong>粒有C:</strong> ", 粒有C, "<br>",
"<strong>微团聚体C:</strong> ", 微团聚体C
),
color = "darkblue",
radius = 6,
fillOpacity = 0.8
)
})
}
# 🚀 4. 启动应用
shinyApp(ui, server)
🧠 怎么用你自己的数据?(以我的数据为例,可以参照这个模板)
只需要:
soil_data <- read.csv("你的数据.csv", encoding = "UTF-8")
确保你有以下字段:
字段名 | 说明 |
---|---|
ID | 样点编号 |
lon | 经度 |
lat | 纬度 |
treatment | 改良剂类型(猪粪/生物炭等) |
level | 添加量(低/中/高) |
pH | 土壤pH |
SOC | 有机碳含量 |
颗粒C | 颗粒有机碳 |
微团聚体C | 微团聚体内碳 |
🔄 高级可扩展性建议:
-
✅ 加一个下载按钮:导出筛选结果;
-
✅ 可视化趋势图(柱状图 + 热力图)组合;
-
✅ 切换地图底图(例如添加卫星地图、地形图);
-
✅ 加时间轴控件(如果你有时间序列数据)。
可以再配个 .Rmd
版本的“交互式研究报告模板”,或者打包为网页发布到 GitHub Pages 或 shinyapps.io。这样你的工作会被人更加了解。