目录
问题描述
完整代码
批量读取
批量绘图
参考资料
当你拿到一系列格式为json文件的数据时,需要进行批量操作,包括批量读取、批量绘图、批量保存。本文旨在介绍如何用简单的循环,用json文件数据批量画伪彩图。
clc;clear all;close all;
path = 'D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\2021\12\22\01\';
diroutput=dir(path);
filenames={diroutput.name};
save_path = ['D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\picture\',path(end-13:end)];
mkdir(save_path)
for i = 51:1:74
name = filenames{i};
data_cell = loadjson(fullfile(path,name));
jsondata = data_cell{1,1};
var = jsondata.data;
var = reshape(var,[200,160]);
var = var';var = flipud(var);
lon = [105:0.05:115 - 0.05];
lat = [15:0.05:23 - 0.05];
time = jsondata.header.refTime;
time = ['time: ',time];
if i <= 58
var(var < mean(mean(var))) = nan;
else
var(var < mean(mean(var))/2 )= nan;
end
value = nanmean(var(:)) -( max(max(var))-nanmean(nanmean(var)));
figure('visible','off');
set(0,'defaultfigurecolor','w')
m_proj('Miller','lon',[105 115],'lat',[15 23]);
m_pcolor(lon,lat,var);
shading interp;
colormap(jet);
colorbar;
caxis([value,max(max(var))]);
hold on;
hold on;
m_proj('Miller','lon',[105.3 115.3],'lat',[15 23]);
m_coast('patch',[0.7 0.7 0.7]);
m_grid('linest','none') ;
colorbar;
caxis([value,max(max(var))])
layer = ['layer: ',num2str(i-51)];
title({time;layer},'fontsize',12);
title(colorbar,'temperature:℃');
%%图片储存
save_name = ['temp_',num2str(i - 51)];
print(gcf,[save_path,save_name],'-dpng','-r600');
end
dir('directory')获得指定文件夹下的所有子文件夹和文件,并存放在结构体中。例如本文中使用了如下代码:
path = 'D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\2021\12\22\01\';
diroutput=dir(path);
filenames={diroutput.name};
name = filenames{3};
程序运行结果: 此路径'D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\2021\12\22\01\'下的所有文件都被读取到了名为“diroutput”的结构体中。将文件名(diroutput.name)提取到元胞数组中存放。需要注意的是,在下一步输出文件名操作时,第一个文件(dens-00-level.json)对应的序号是3,因为使用dir()函数提取文件时,结构体中默认前2项分别名为“.”和“..”。
mkdir('foldername')在指定路径下创建文件夹foldername。例如本文中使用了如下代码:
path = 'D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\2021\12\22\01\';
diroutput=dir(path);
filenames={diroutput.name};
save_path = ['D:\MATLAB_DATA\DATA\TS_DEPTH_NAVY\picture\',path(end-13:end)];
mkdir(save_path)
程序运行结果:按照指定路径'save_path'新建文件夹。
因为文件夹中的.json数据文件是顺序排列的,所以可以直接用循环按顺序读取,接下来将介绍读取.json文件使用的函数、读取方法。
for i = 51:1:74
%%读取数据
name = filenames{i};
data_cell = loadjson(fullfile(path,name));
jsondata = data_cell{1,1};
var = jsondata.data;
前文已经说过,目标文件夹中的所有文件名'name'已经被储存到元胞数组'filename'中,因此按下标输出文件名,并赋值给变量'name'。51到74是温度数据文件所在的序号。
fullfile('filepath','filename')函数:将'filepath'和'filename'之间用'\'连接起来,形成新的字符串。fullfile()函数是一个非常灵活的函数,以下四行代码执行的结果都是字符串:'a\b'。
fullfile('a','b')
fullfile('a','\b')
fullfile('a\','b')
fullfile('a\','\b')
loadjson('filename')函数:读取.json文件,并将文件中的数据保存到一个1×1的cell中。 使用loadjson()函数需要额外下载数据包,下载网址如下:
iso2mesh: a Matlab/Octave-based mesh generator: jsonlab/Download (sourceforge.net)
先在左侧的jsonlab目录下点击‘download’,再下载‘download previous releases’中的第一个版本。
figure('visible','off');
set(0,'defaultfigurecolor','w')
m_proj('Miller','lon',[105 115],'lat',[15 23]);
m_pcolor(lon,lat,var);
shading interp;
colormap(jet);
colorbar;
caxis([value,max(max(var))]);
figure('visible','off'):画图后不弹出绘图窗口,加快程序运行速度。
m_pcolor(x,y,z):绘制伪彩色图,矩阵z的维度必须与x,y对应。
shading interp:
通过在每个线条或面中对颜色图索引或真彩色值进行插值来改变该线条或面中的颜色。
colormap(jet):调整颜色图。
title({time;layer},'fontsize',12):图的标题需要设置成上下两行时,可以用这样的形式。注意,time和layer是变量,time = ‘time: 2021-12-21T00:00:000Z’;layer = ‘layer: 0’
title(colorbar,'temperature:℃'):设置colorbar的标题。
save_name = ['temp_',num2str(i - 51)];
print(gcf,[save_path,save_name],'-dpng','-r600');
num2str()函数:将数字转换为字符串。
print(gcf,savename,'type','resolution'):将图像以指定文件名,保存在指定文件夹下,并指定文件类型、分辨率。
《MATLAB》专刊:dir函数详解_matlab dir_阿呆591的博客-CSDN博客https://blog.csdn.net/qq_42164483/article/details/119459321
新建文件夹 - MATLAB mkdir - MathWorks 中国https://ww2.mathworks.cn/help/matlab/ref/mkdir.html设置颜色着色属性 - MATLAB shading - MathWorks 中国
https://ww2.mathworks.cn/help/matlab/ref/shading.html