Matlab绘图(2)通过代码进行局部放大绘图、多文件绘图
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)通过代码进行局部放大绘图、多文件绘图的更多相关文章
- MATLAB之折线图、柱状图、饼图以及常用绘图技巧
MATLAB之折线图.柱状图.饼图以及常用绘图技巧 一.折线图 参考代码: %图1:各模式直接成本预测 %table0-table1为1*9的数组,记录关键数据 table0 = data_modol ...
- Quatre 2D的绘图功能的三个步骤(上下文,绘图,渲染)
一.qurza2d是怎么将绘图信息和绘图的属性绘制到图形上下文中去的? 说明: 新建一个项目,自定义一个view类和storyboard关联后,重写该类中的drowrect方法. 画线的三个步骤: ( ...
- MATLAB Coder从MATLAB生成C/C++代码步骤
MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤: 准备用于产生代码的MATLAB算法: 检查MATLAB代 ...
- 转 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤
MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. http://www.mathworks.cn/products/matlab-coder/ 使用MATL ...
- 【Matlab开发】MATLAB编译C/C++代码
在使用MATLAB编译C/C++代码时,C/C++代码中要使用一个mexFunction函数,那么这个函数是如何定义,在编译时又是如何实现的呢?下面我将使用实例进行说明. 如一个简单的函数: doub ...
- Matlab处理数据导出Paraview可读的vtk文件(二)
由于我在用SPH方法仿真时用的是FORTRAN语言,并且没有找到直接输出vtk文件的代码,因此偷懒通过MATLAB转换一下数据. 用到的Matlab子程序可通过一下链接找到. Matlab处理数据导出 ...
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以 ...
- 从jsTree演示代码中提取的在线文件查看
从jsTree演示代码中提取的在线文件查看 jsTree 请参考:https://www.jstree.com/ 效果如下: 代码下载:http://files.cnblogs.com/files/z ...
- 分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)
原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <student ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
随机推荐
- Docker安装好后服务启动不了
安装 安装方式参考地址:https://www.docker.org.cn/book/install/install-docker-on-rhel-29.html 问题 安装好后启动不了服务器.查看状 ...
- MySQL---面经
如果想要对 MySQL 的索引树有更深入的了解,掘金的小册子:<MySQL 是怎样运行的> MySQL 是怎样运行的 以下是常见面试题 MySQL日志 MySQL日志系统 redo_log ...
- Swagger (API框架,API 文档 与API 定义同步更新)
1.依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...
- 基于stm32H730的解决方案开发之点亮第一个LED灯
一 概述 STM32H730超值系列内含ArmCortex-M7内核(具有双精度浮点单元),工作频率可达550 MHz.内嵌的128 KB闪存使意法半导体能够为开发人员提供一种经济划算的解决方案.凭借 ...
- Python下使用串口发送十六进制数据
import serial from time import sleep def recv(serial): while True: data = serial.read_all() if data ...
- 不可不知道的python装饰器
前记 python小白,估计很多没用过这个高级功能吧,当你用了它之后就会发现,真是非常好用喔. 装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增 ...
- 使用gradle打包springboot项目
这边整理下自己项目使用gradle打jar包的坎坷经历,使用的方式是命令行的方式 首先配置build.gradle跟我一样 plugins { id 'java' id 'org.springfram ...
- 【Leetcode】63. 不同路径 II
题目(链接) 一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 ...
- 记录--CSS 如何实现羽化效果?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到这样一个问题,在一张封面上直接显示书名,可能会存在书名看不太清楚的情况(容易受到背景干扰),如下 为了解决这个问题,设计师提了一个 ...
- 阿里二面:谈谈ThreadLocal的内存泄漏问题?问麻了。。。。
引言 ThreadLocal在Java多线程编程中扮演着重要的角色,它提供了一种线程局部存储机制,允许每个线程拥有独立的变量副本,从而有效地避免了线程间的数据共享冲突.ThreadLocal的主要用途 ...