如何在R中将3种光谱指数与LST共4个变量绘制到单张图中
在R中整合多变量与LST的相关性可视化
当然可以把三个光谱指数和LST整合到单张图里,核心是先把数据整理成长格式,再用ggplot2实现分组或分面可视化,以下是具体步骤:
1. 数据读取与预处理
首先用raster包读取ASCII栅格,合并为不含缺失值的数据框:
library(raster) library(tidyverse) # 读取各栅格文件(替换为你的文件路径) ndvi_raster <- raster("ndvi.asc") ndbi_raster <- raster("ndbi.asc") ndwi_raster <- raster("ndwi.asc") lst_raster <- raster("lst.asc") # 合并栅格为数据框,剔除NA值 combined_df <- as.data.frame(stack(ndvi_raster, ndbi_raster, ndwi_raster, lst_raster)) %>% drop_na() %>% rename(NDVI = layer.1, NDBI = layer.2, NDWI = layer.3, LST = layer.4)
2. 转换为长格式数据
将三个光谱指数转为分组变量,方便后续绘图时按指数区分:
long_df <- combined_df %>% pivot_longer( cols = c(NDVI, NDBI, NDWI), names_to = "Spectral_Index", values_to = "Index_Value" )
3. 整合型散点图(带拟合线)
用不同颜色区分三个光谱指数,同时添加线性拟合线展示相关性,适合直观对比三者与LST的关系:
ggplot(long_df, aes(x = Index_Value, y = LST, color = Spectral_Index)) + geom_point(alpha = 0.3, size = 0.8) + # 降低透明度避免点重叠 geom_smooth(method = "lm", se = TRUE) + # 线性拟合+置信区间 labs( title = "光谱指数与地表温度(LST)的相关性", x = "光谱指数值", y = "地表温度(LST)", color = "光谱指数" ) + theme_minimal() + scale_color_manual(values = c("#228B22", "#CD5C5C", "#1E90FF")) # 自定义颜色对应NDVI/NDBI/NDWI
可选:分面子图(避免点重叠)
如果散点过于密集,分面展示每个指数与LST的关系会更清晰,同时保持在同一张图内:
ggplot(long_df, aes(x = Index_Value, y = LST)) + geom_point(alpha = 0.3, size = 0.8) + geom_smooth(method = "lm", se = TRUE, color = "#FF4500") + facet_wrap(~Spectral_Index, scales = "free_x") + # 每个指数单独子图,x轴自适应 labs( title = "光谱指数与地表温度(LST)的相关性", x = "光谱指数值", y = "地表温度(LST)" ) + theme_minimal()
进阶:密度热力散点图
如果数据量极大,用热力图替代普通散点,能更直观展示数据分布密度:
ggplot(long_df, aes(x = Index_Value, y = LST)) + geom_hex(bins = 50) + geom_smooth(method = "lm", se = TRUE, color = "white") + facet_wrap(~Spectral_Index, scales = "free_x") + scale_fill_viridis_c(name = "点密度") + labs( title = "光谱指数与LST的相关性(密度热力图)", x = "光谱指数值", y = "地表温度(LST)" ) + theme_minimal()
注意:如果栅格数据投影不一致,需先用projectRaster()统一投影后再合并。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

