Matlab进阶绘图

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

参数设置

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

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

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

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

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

这里

数据导入

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

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

绘制全图

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

绘制放大图

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

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

最终效果展示




完整代码

clear;
clc;
% for TS2-SparseEA
title_d = {'SMOP1','SMOP3','SMOP7','SMOP8'};
figname = {'SECSO','SPS','SNSGAII','LERD','TS2SparseEA'};
led = {'S-ECSO','SPS','S-NSGA-II','LERD','TS2-SparseEA'};
Marker = ['s','*','s','d','v'];
idx = [1,3,7,8];
dimension = {'1000d','3000d'}; % for TSD-MOEA
% title_d = {'Sparse NN','Sparse SR','Sparse PO'};
% figname = {'MOEAPSL','SECSO','PMMOEA','TSDMOEA'};
% led = {'MOEA/PSL','S-ECSO','PM-MOEA','TSD-MOEA'};
% Marker = ['s','*','s','d'];
% 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]};
% idx = [1,3,7];
% dimension = {'3000d','RealWorld'};
% problem = {'NN','SR','PO'};
d = 2; % zoom range
%self define
% TS2
xl = {[0.4 0.5], [0.4 0.5],[0.4 0.5],[0.4 0.5]};
yl = {[0.5 0.75], [0.5 0.75],[0.8 1.2], [0.8 1.5]}; % TSD
% xl = {[0 0.03], [0.05 0.1],[1.57e-7 8.33e-7]};
% yl = {[0.15 0.25], [0.78 0.82],[0.01 0.02]};
% label for each fig
% x_label = {'Complexity of neural network', 'Sparsity of reconstructed signal', 'Risk'};
% y_label = {'Training error', 'Loss of reconstructed signal', 'Return'}; for i = 1:4 xdata = [];
ydata = [];
% 数据导入
for j = 1:5
fig = openfig(['./MyPlot/Objective_Value_Distribution/figs/TS2SparseEA/',dimension{d},'/SMOP',num2str(idx(i)),'/',figname{j},'.fig'],'invisible');
% TSD
% fig = openfig(['./MyPlot//Objective_Value_Distribution/figs/TSDMOEA/',dimension{d},'/',problem{i},'/',figname{j},'.fig'],'invisible');
lines = findobj(fig, 'type', 'line');
xdata = [xdata;get(lines, 'XData')];
ydata = [ydata;get(lines, 'YData')];
end % 绘制全图
figure;
ax1 = axes('Position', [0.15 0.15 0.75 0.75]);
axes(ax1);
for j = 1:5
scatter(xdata(j, :), ydata(j, :),'Marker',Marker(j),'SizeData',60,LineWidth=1.5);
box on;
hold on;
end
title(title_d{i});
set(gca,'FontName','Times New Roman','FontSize',17);
xlabel('$f_1$', 'Interpreter', 'latex');
ylabel('$f_2$', 'Interpreter', 'latex'); % TSD
% xlabel(x_label{i});
% ylabel(y_label{i});
legend(led); % 绘制放大图
ax2 = axes('Position', [0.5 0.2 0.3 0.35]);
axes(ax2); % 设置要放大的x轴范围
% 找到范围内的数据点
for j = 1: 5
zoom_in_idx = (xdata(j, :) >= xl{i}(1)) & (xdata(j, :) <= xl{i}(2)) & (ydata(j, :) >= yl{i}(1)) & (ydata(j, :) <= yl{i}(2));
xdata_zoom_in{j} = xdata(j, zoom_in_idx);
ydata_zoom_in{j} = ydata(j, zoom_in_idx);
end for j = 1:5
scatter(xdata_zoom_in{j}, ydata_zoom_in{j},'Marker',Marker(j),'SizeData',150,LineWidth=1.5);
box on;
hold on;
end
set(gca, 'xtick',[], 'ytick',[]);
hold off;
end

Matlab绘图(2)通过代码进行局部放大绘图、多文件绘图的更多相关文章

  1. MATLAB之折线图、柱状图、饼图以及常用绘图技巧

    MATLAB之折线图.柱状图.饼图以及常用绘图技巧 一.折线图 参考代码: %图1:各模式直接成本预测 %table0-table1为1*9的数组,记录关键数据 table0 = data_modol ...

  2. Quatre 2D的绘图功能的三个步骤(上下文,绘图,渲染)

    一.qurza2d是怎么将绘图信息和绘图的属性绘制到图形上下文中去的? 说明: 新建一个项目,自定义一个view类和storyboard关联后,重写该类中的drowrect方法. 画线的三个步骤: ( ...

  3. MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...

  4. 转 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. http://www.mathworks.cn/products/matlab-coder/ 使用MATL ...

  5. 【Matlab开发】MATLAB编译C/C++代码

    在使用MATLAB编译C/C++代码时,C/C++代码中要使用一个mexFunction函数,那么这个函数是如何定义,在编译时又是如何实现的呢?下面我将使用实例进行说明. 如一个简单的函数: doub ...

  6. Matlab处理数据导出Paraview可读的vtk文件(二)

    由于我在用SPH方法仿真时用的是FORTRAN语言,并且没有找到直接输出vtk文件的代码,因此偷懒通过MATLAB转换一下数据. 用到的Matlab子程序可通过一下链接找到. Matlab处理数据导出 ...

  7. 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

    1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...

  8. 从jsTree演示代码中提取的在线文件查看

    从jsTree演示代码中提取的在线文件查看 jsTree 请参考:https://www.jstree.com/ 效果如下: 代码下载:http://files.cnblogs.com/files/z ...

  9. 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)

    原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...

  10. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

随机推荐

  1. 详解Python魔法函数,__init__,__str__,__del__

    1.简介 Python作为一门灵活而强大的编程语言,提供了许多特殊的方法,被称为魔法函数(Magic methods).这些魔法函数以双下划线开头和结尾,能够让我们自定义类的行为,使得Python更加 ...

  2. 新零售SaaS架构:什么是线上商城系统?

    零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者.因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳,往往是 ...

  3. 【图算法】构建消息传递网络教程 Creating Message Passing Networks by Pytorch-geometric

    一.背景 将卷积运算推广到不规则域通常表示为邻局聚合(neighborhood aggregation)或消息传递(neighborhood aggregation)模式. \(\mathbf{x}^ ...

  4. 文件的特殊权限:SUID,SGID,SBIT

    文件的特殊权限:SUID,SGID,SBIT Set UID SUID权限只用于二进制文件 运行者必须有X权限 运行者在程序运行过程(run-time)中具有二进制文件拥有者(owner)的权限 例子 ...

  5. Django:Could not find backend 'django_redis.cache.RedisCache': cannot import name 'six'

    1.报错内容: django.core.cache.backends.base.InvalidCacheBackendError: Could not find backend 'django_red ...

  6. 建民哥哥的AV

    1 #include<bits/stdc++.h> 2 #include<vector> 3 #include<algorithm> 4 using namespa ...

  7. CSS(选择器、字体属性、文本属性、三种引入方式)

    css简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称. 有时我们也会称之为 CSS 样式表或级联样式表. CSS 是也是一种标记语言 CSS 主要用于设置 H ...

  8. Vue中组件和插件有什么区别?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.组件是什么 回顾以前对组件的定义: 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在Vue中每一个. ...

  9. 记录--前端加载超大图片(100M以上)实现秒开解决方案

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前端加载超大图片时,一般可以采取以下措施实现加速: 图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间.压缩图片时需要 ...

  10. Unity实现敌人生命条

    在敌人物体身上添加 Slider,将Background设置为黑色,FIllarea设置为绿色,调整滑块大小. 生命值减少代码设计如下: using System.Collections; using ...