经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
Matlab绘图(2)通过代码进行局部放大绘图、多文件绘图
来源:cnblogs  时间:2024/4/17 15:26:54  对本文有异议

Matlab进阶绘图

在这次的绘图练习中,我们需要考虑一次性将所有数据文件逐一读入,然后对每幅图图片进行放大处理。

参数设置

这里包括每幅图的标题,图例,读入文件的名称,等等

  1. title_d = {'SMOP1','SMOP3','SMOP7','SMOP8'}; %指定每幅图的标题
  2. figname = {'SECSO','SPS','SNSGAII','LERD','TS2SparseEA'}; %指定需要读入的文件名
  3. led = {'S-ECSO','SPS','S-NSGA-II','LERD','TS2-SparseEA'}; %指定每幅图片显示的图例(这里每幅图片包括多个曲线)
  4. Marker = ['s','*','s','d','v']; %指定图片里每条曲线的形状
  5. idx = [1,3,7,8]; %指定子文件夹名称,配合后面代码使用
  6. dimension = {'1000d','3000d'}; %指定子文件夹名称,配合后面代码使用

除此之外,还有一项关键内容,就是需要指定放大的区域。

  1. xl = {[0.4 0.5], [0.4 0.5],[0.4 0.5],[0.4 0.5]}; %指定每幅图x轴放大的区域
  2. yl = {[0.5 0.75], [0.5 0.75],[0.8 1.2], [0.8 1.5]}; %指定每幅图y轴放大的区域

至此我们完成大致准备工作
这里

数据导入

这里我们暂时只考虑一幅图片的数据导入,之后我会把完整代码(多文件数据读取)放出。这里我们的数据来源是Matlab中的Fig文件,当然如果你有直接数据,然后可以忽略这一操作步骤。

  1. xdata = [];
  2. ydata = [];
  3. % 数据导入
  4. for j = 1:5
  5. %打开Fig, ['./MyPlot/Objective_Value_Distribution/figs/TS2SparseEA/',dimension{d},'/SMOP',num2str(idx(i)),'/',figname{j},'.fig']表示把数据里的元素拼接成一个路径。
  6. %invisible表示打开图片时,不显示图片,若该为visible则会打开此图片(建议不要开)
  7. fig = openfig(['./MyPlot/Objective_Value_Distribution/figs/TS2SparseEA/',dimension{d},'/SMOP',num2str(idx(i)),'/',figname{j},'.fig'],'invisible');
  8. lines = findobj(fig, 'type', 'line'); %找到fig里面所有的曲线
  9. xdata = [xdata;get(lines, 'XData')]; %get(lines, 'XData'/'YData')表示获取所有曲线的横坐标和纵坐标
  10. ydata = [ydata;get(lines, 'YData')];
  11. end

绘制全图

  1. %由于我们要在一个fig里面绘制两幅图(原图和放大图),因此需要两个坐标轴
  2. figure;
  3. % 创建全图的坐标轴,并指定其位置'Position'
  4. ax1 = axes('Position', [0.15 0.15 0.75 0.75]);
  5. %设置当前轴为全图的坐标轴
  6. axes(ax1);
  7. %曲线绘制,共有5条,box on表示显示图的框线,可以自己去掉看看变化。hold on表示不创建新的fig继续在当前fig上绘制其他曲线。
  8. for j = 1:5
  9. scatter(xdata(j, :), ydata(j, :),'Marker',Marker(j),'SizeData',60,LineWidth=1.5);
  10. box on;
  11. hold on;
  12. end
  13. title(title_d{i});
  14. %设置当前图的字体等信息
  15. set(gca,'FontName','Times New Roman','FontSize',17);
  16. %设置xlabelylabel的文字,这里使用latex显示
  17. xlabel('$f_1$', 'Interpreter', 'latex');
  18. ylabel('$f_2$', 'Interpreter', 'latex');
  19. %显示当前轴的图例
  20. legend(led);

绘制放大图

有时候,由于原图里面各个曲线直接的距离很近,因此无法显出显著区别,在这种情况下,我们就需要对原图进行局部区域放大并绘制放大图以体现各曲线之间的细微区别。

  1. %设置放大图的坐标轴
  2. ax2 = axes('Position', [0.5 0.2 0.3 0.35]);
  3. %将当前轴设置为放大轴
  4. axes(ax2);
  5. for j = 1: 5
  6. %找到符合x轴放大区域和y轴放大区域的x坐标下标
  7. zoom_in_idx = (xdata(j, :) >= xl{i}(1)) & (xdata(j, :) <= xl{i}(2)) & (ydata(j, :) >= yl{i}(1)) & (ydata(j, :) <= yl{i}(2));
  8. %得到x坐标和y坐标
  9. xdata_zoom_in{j} = xdata(j, zoom_in_idx);
  10. ydata_zoom_in{j} = ydata(j, zoom_in_idx);
  11. end
  12. %局部放大曲线绘制,hold off表示第一张fig已经画完了,下面再次绘图时会创建一个新的fig而不是当前的。
  13. for j = 1:5
  14. scatter(xdata_zoom_in{j}, ydata_zoom_in{j},'Marker',Marker(j),'SizeData',150,LineWidth=1.5);
  15. box on;
  16. hold on;
  17. end
  18. %隐藏放大图的x轴和y轴,不显示其他信息,可以自己去掉看看变化。
  19. set(gca, 'xtick',[], 'ytick',[]);
  20. hold off;

最终效果展示

图片名称 图片名称 图片名称 图片名称

完整代码

  1. clear;
  2. clc;
  3. % for TS2-SparseEA
  4. title_d = {'SMOP1','SMOP3','SMOP7','SMOP8'};
  5. figname = {'SECSO','SPS','SNSGAII','LERD','TS2SparseEA'};
  6. led = {'S-ECSO','SPS','S-NSGA-II','LERD','TS2-SparseEA'};
  7. Marker = ['s','*','s','d','v'];
  8. idx = [1,3,7,8];
  9. dimension = {'1000d','3000d'};
  10. % for TSD-MOEA
  11. % title_d = {'Sparse NN','Sparse SR','Sparse PO'};
  12. % figname = {'MOEAPSL','SECSO','PMMOEA','TSDMOEA'};
  13. % led = {'MOEA/PSL','S-ECSO','PM-MOEA','TSD-MOEA'};
  14. % Marker = ['s','*','s','d'];
  15. % color = {[214/255,232/255,121/255],[247/255,202/255,69/255],[82/255,198/255,160/255],[246/255,177/255,120/255]};
  16. % idx = [1,3,7];
  17. % dimension = {'3000d','RealWorld'};
  18. % problem = {'NN','SR','PO'};
  19. d = 2;
  20. % zoom range
  21. %self define
  22. % TS2
  23. xl = {[0.4 0.5], [0.4 0.5],[0.4 0.5],[0.4 0.5]};
  24. yl = {[0.5 0.75], [0.5 0.75],[0.8 1.2], [0.8 1.5]};
  25. % TSD
  26. % xl = {[0 0.03], [0.05 0.1],[1.57e-7 8.33e-7]};
  27. % yl = {[0.15 0.25], [0.78 0.82],[0.01 0.02]};
  28. % label for each fig
  29. % x_label = {'Complexity of neural network', 'Sparsity of reconstructed signal', 'Risk'};
  30. % y_label = {'Training error', 'Loss of reconstructed signal', 'Return'};
  31. for i = 1:4
  32. xdata = [];
  33. ydata = [];
  34. % 数据导入
  35. for j = 1:5
  36. fig = openfig(['./MyPlot/Objective_Value_Distribution/figs/TS2SparseEA/',dimension{d},'/SMOP',num2str(idx(i)),'/',figname{j},'.fig'],'invisible');
  37. % TSD
  38. % fig = openfig(['./MyPlot//Objective_Value_Distribution/figs/TSDMOEA/',dimension{d},'/',problem{i},'/',figname{j},'.fig'],'invisible');
  39. lines = findobj(fig, 'type', 'line');
  40. xdata = [xdata;get(lines, 'XData')];
  41. ydata = [ydata;get(lines, 'YData')];
  42. end
  43. % 绘制全图
  44. figure;
  45. ax1 = axes('Position', [0.15 0.15 0.75 0.75]);
  46. axes(ax1);
  47. for j = 1:5
  48. scatter(xdata(j, :), ydata(j, :),'Marker',Marker(j),'SizeData',60,LineWidth=1.5);
  49. box on;
  50. hold on;
  51. end
  52. title(title_d{i});
  53. set(gca,'FontName','Times New Roman','FontSize',17);
  54. xlabel('$f_1$', 'Interpreter', 'latex');
  55. ylabel('$f_2$', 'Interpreter', 'latex');
  56. % TSD
  57. % xlabel(x_label{i});
  58. % ylabel(y_label{i});
  59. legend(led);
  60. % 绘制放大图
  61. ax2 = axes('Position', [0.5 0.2 0.3 0.35]);
  62. axes(ax2);
  63. % 设置要放大的x轴范围
  64. % 找到范围内的数据点
  65. for j = 1: 5
  66. zoom_in_idx = (xdata(j, :) >= xl{i}(1)) & (xdata(j, :) <= xl{i}(2)) & (ydata(j, :) >= yl{i}(1)) & (ydata(j, :) <= yl{i}(2));
  67. xdata_zoom_in{j} = xdata(j, zoom_in_idx);
  68. ydata_zoom_in{j} = ydata(j, zoom_in_idx);
  69. end
  70. for j = 1:5
  71. scatter(xdata_zoom_in{j}, ydata_zoom_in{j},'Marker',Marker(j),'SizeData',150,LineWidth=1.5);
  72. box on;
  73. hold on;
  74. end
  75. set(gca, 'xtick',[], 'ytick',[]);
  76. hold off;
  77. end

原文链接:https://www.cnblogs.com/hywang1211/p/18132528

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号