当前位置:   article > 正文

ArcGIS批量按协变量掩膜提取数据,并导入matlab制作箱线图_arcgis和matlab

arcgis和matlab

背景:有八张分层的土壤有机碳含量图,要按土地利用/坡向/海拔的分类图分别制作每一种协变量下每一张图层的箱线图——先在ArcGIS里提取四分位数,再导入matlab制作箱线图。

一、ArcGIS使用的python代码

import arcpy

import numpy as np

import matplotlib.pyplot as plt

from arcpy.sa import *

# 设置工作空间

arcpy.env.workspace = "C:\\工作空间的文件夹名"

# 设置掩膜和地图的名称列表

mask_names = ["mask1", "mask2", "mask3"]

#输入需要提取的多张掩膜名字,需要注意,在这之前需要先在arcgis里把掩膜分好

map_names = ["map1","map2"]

#输入需要提取的多张地图名字

# 存储结果的列表

results = []

# 循环遍历掩膜和地图名称列表

for mask_name in mask_names:

mask_path = mask_name + ".tif"

for map_name in map_names:

map_path = map_name + ".tif"

        # 使用按掩膜提取工具进行栅格提取

        outExtractByMask = ExtractByMask(map_path, mask_path)

        # 将提取的栅格数据转换为NumPy数组,并用 np.nan 替换 NoData 值

        np_array = arcpy.RasterToNumPyArray(outExtractByMask, nodata_to_value=np.nan)

        # 计算栅格数据的四分位数,忽略 np.nan 值

        quartiles = np.nanpercentile(np_array, [25, 75])

        # 打印栅格属性信息

        result = [map_name, mask_name, np.nanmin(np_array), np.nanmax(np_array), np.nanmean(np_array), quartiles[0], np.nanmedian(np_array), quartiles[1]]

        results.append(result)

# 将所有结果输出到TXT文件

output_folder = "C:\\输出文件夹"

output_file = "文件名.txt"

output_path = "{}\\{}".format(output_folder, output_file)

with open(output_path, 'w') as f:

    # 写入表头

    f.write("Map Name,Mask Name,Minimum,Maximum,Mean,Quartile1,Median,Quartile3\n")

    # 写入结果

    for result in results:

        f.write("{},{},{},{},{},{},{},{}\n".format(result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7]))

二、在matlab中批量制作箱线图

注:将文本文件导入excel并按逗号分列,删去平均值列,将最大值放在最后一列,从左到右从小到大排好,删去第一行,前两列的mask和map名可以保留

%% % 读取数据
% 读取Excel表格中的数据
data = readmatrix('C:\表格位置\表格名.xlsx','Range','A1:G32');

%表格范围保留了不参与绘制的前两列,注意选择范围

% 将每行的第三到第七列数据构成一个箱子
num_box = size(data,1) / 4;

%此处的分母与每张图中需要的箱子数一致,也就是上文的mask数量


box_data = cell(num_box,1);
for i = 1:num_box
    box_data{i} = data((i-1)*4+1:i*4,3:7)';

%这里的4仍旧是掩膜数,3:7是选择的列的范围,可以调
end

% 绘制箱型图
figure;
for i = 1:num_box
    subplot(2,4,i);

%这里的2,4指的是一列两个,一行四个


    b=boxplot(box_data{i},'Colors','k','Symbol','k+');
     set(b(7,:), 'LineWidth', 3, 'Color', 'k');
    set(gca,'Color','w','LineWidth',1,'TickLength',[0.02 0.025]);
    title(['  '],'Color','k');
    xlabel([' '],'Color','k');
    set(gca,'XTickLabel',[]);
end

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号