【实用教程】基于python可视化影像统计值分析时间序列变化

科技   2024-08-28 12:01   广东  

大家好

我是瓶子~,又见面咯~

不知不觉假期余额又又又不足了,瓶子最近也面临着开学“危机”。不过这几天确实应该整理整理心情投入到新一轮的奋斗中了

屏幕前热爱学习的你不如动动小手滑动阅读一下小火的推文,把觉得有用的文章收藏一下方便后期阅读使用哦

好啦言归正传,瓶子最近在学习的过程中,发现了一个容易忽略的科学问题。就是当我们把一整组影像放在arcgis中的时候,可能可以发现他的最大最小值的趋势是什么,但是其实很容易忽略其平均值。在一些研究中,我们是需要看平均值的趋势的,而最大最小值的趋势并不能代表平均值趋势,所以我们就需要制图分析。

于是,一篇(shuishuide)高质量推文就呼之欲出了!只需要修改一下数据所在的路径就可以实现影像统计值的可视化了!

废话不多说了,直接呈上代码!

# -*- encoding:utf-8 -*-import osimport numpy as npimport pandas as pdfrom osgeo import gdalimport matplotlib.pyplot as plt
def gdal_analysis(in_path, out_csv): # 获取.tif文件列表 tifs = [os.path.join(in_path, i) for i in os.listdir(in_path) if i.endswith(".tif")] # 初始化用于存储统计数据的字典 stat_data = { 'fileName': [], 'count': [], 'min': [], 'max': [], 'sum': [], 'mean': [], 'median': [], 'std': [] }
# 遍历每个.tif文件,计算统计数据 for in_tif in tifs: bname = os.path.basename(in_tif) fname = os.path.splitext(bname)[0] rds = gdal.Open(in_tif) # 打开文件 band = rds.GetRasterBand(1) # 获取第一个波段 ndv = band.GetNoDataValue() # 获取无数据值 values = np.array(band.ReadAsArray()).ravel() # 将波段数据读入数组 values = values[values != ndv] # 排除无数据值
# 计算统计量并添加到字典 stat_data['fileName'].append(fname) stat_data['count'].append(len(values)) stat_data['min'].append(np.min(values)) stat_data['max'].append(np.max(values)) stat_data['sum'].append(np.sum(values)) stat_data['mean'].append(np.mean(values)) stat_data['median'].append(np.median(values)) stat_data['std'].append(np.std(values))
# 将统计数据字典转换为DataFrame res_df = pd.DataFrame(stat_data)
# 提取文件名和平均值作为图表数据 file_names = np.array(res_df['fileName']) mean_values = res_df['mean'].values
# 绘制折线图 plt.figure(figsize=(12, 6)) plt.plot(file_names, mean_values, label='Mean Value', marker='o', linestyle='-') plt.plot(file_names, res_df['median'].values, label='Median Value', marker='s', linestyle='--') plt.plot(file_names, res_df['min'].values, label='Min Value', marker='v', linestyle='-.') plt.plot(file_names, res_df['max'].values, label='Max Value', marker='^', linestyle=':')
# 设置图例、标题、x轴和y轴标签 plt.legend() plt.title('Raster Data Statistics Over Time') plt.xlabel('File Name') plt.ylabel('Statistic Value')
# 优化x轴的显示,防止文件名重叠 plt.xticks(rotation=45)
# 显示网格 plt.grid(True)
# 显示图表 plt.tight_layout() # 调整布局以适应所有标签 plt.show()
# 保存DataFrame到CSV文件 res_df.to_csv(out_csv, index=False)
# 输入输出路径path1 = r"J:\Geographic_data\2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)"csv1 = r"J:\Geographic_data\2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)\statistics.csv"
# 执行函数gdal_analysis(path1, csv1)print("done")

输出的结果是:

表格一张

文件一个

数据案例下载:

2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)

链接: https://pan.baidu.com/s/1X8ZIf2pqVAzjr-kYrlvJMQ?pwd=msr3 提取码: msr3

祝小火伴们开学开心~

宇宙级声明:以上风格仅代表本期小编


小火苗GIS
分享GIS前沿资讯、竞赛解析、专业技能及数据资料等
 最新文章