软件版本:MATLAB R2016a.使用scatter3()函数画散点图。初始数据进行处理之后,写入新的文本文档中,每行的数据类型为%d %d %d %f中间以空格分离。将每行的前面三个整形作为三维空间的x,y,z坐标,%f一列对应的数据作为颜色值,颜色将会随着最后一列值的变化而变化。
一开始的部分代码:
for n = 1:12000
tline = fgetl(fidin);
tline = str2num(tline);
x = tline(:,1);
y = tline(:,2);
z = tline(:,3);
c = tline(:,4);
scatter3(x,y,z,20,c,'filled');
if n == 1
caxis([0 1.16e+08]);
colormap(spring(1e+6));
map = colormap;
map(1,:) = [0 0 0];
colormap(map);
colorbar;
title(['Timestep = ', num2str((j-1)*10),', Stage',num2str(m+22)]);
xlabel('x');
ylabel('y');
zlabel('z');
end
end
上述代码的主要时间花在scatter3函数上,可以通过MATLAB界面上方的“运行并计时”得出。上述代码效率较低,画12000个点要花上10多秒钟。我的电脑配置是酷睿i5,双核四线程。后来我发现主要的原因是一行一行读取文本数据所致。正确的方法是一次性将所有的点画出,不要一行一行的将数据读出再一个一个点画。
改进后的代码如下:
fidin = fopen(filename, 'rt');
A = textscan(fidin, '%d %d %d %f');
scatter3(A{1}, A{2}, A{3}, 10, A{4}, 'fill');
caxis([0 1e+07]);
colormap(jet(1e+6));
map = colormap;
map(1,:) = [1 1 1];
colormap(map);
colorbar;
title(['Timestep = ', num2str((i-1)*10),', Stage',num2str(j+22)]);
xlabel('x');
ylabel('y');
zlabel('z');
此时的程序执行速度明显提升,12000个点不到3秒钟就可以画完,效果也很好。
清凉一夏,祝大家学习愉快!