首页 > 其他分享 >Matlab绘图(2)通过代码进行局部放大绘图、多文件绘图

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

时间:2024-04-17 12:22:06浏览次数:25  
标签:代码 0.5 fig 放大 绘图 Matlab ydata 255 xdata

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

标签:代码,0.5,fig,放大,绘图,Matlab,ydata,255,xdata
From: https://www.cnblogs.com/hywang1211/p/18132528

相关文章

  • ggplot 中绘图设置 轴标签和标题与绘图区域的间距
     001、基础绘图library(ggplot2)p<-ggplot(faithful,aes(x=eruptions,y=waiting))+geom_point()p 002、调整标签刻度到绘图区域的间距p+theme(axis.text.x=element_text(vjust=-8))##调整x标签刻度到绘图区域的间距 003、调整绘......
  • 强!一款贼好用的低代码报表工具,开源免费!
    大家好,我是狂师!今天给大家推荐一款免费的数据可视化报表设计工具:JimuReport,类似excel操作风格,在线拖拽完成报表设计!项目号称:功能永久免费、可以商用、永久免费使用!1、JimuReport介绍JimuReport是北京国炬信息技术有限公司旗下的平台,是一款免费的数据可视化报表工具,主要用于报表......
  • 基于yolov2深度学习网络的螺丝螺母识别算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      在工业自动化和质量控制领域,准确且高效的螺丝螺母识别至关重要。深度学习方法,特别是基于卷积神经网络(CNN)的目标检测技术,因其卓越的特征提取能力,成为解决此类问题的有效手段。YOLOv2......
  • 【编译原理】正则式转NFA转DFA 代码实现(C/C++)
    直接上代码:#include<bits/stdc++.h>usingnamespacestd;//nfa结构定义structnst{vector<int>a[26],e;//接收a-z会到达的状态,接收eps会到达的状态boolf=0;//=0为可接受态};vector<nst>nfa;set<char>alp;stringstr;set<int>accepted;struc......
  • SpringBoot+SpringSecurity6+Jwt最小化代码
    SpringBoot+SpringSecurity6+Jwt最小化代码[toc]零、参考资料https://blog.csdn.net/m0_71273766/article/details/132942056一、快速开始1.1、引入依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0&quo......
  • c代码自动生成类图 uml understand
    Understand:静态代码分析神器_scitoolsunderstand-CSDN博客一直以来,我以为SourceInsight的代码分析已经是业界最强、最专业。今天试用了一下Scitools的Understand,导入代码后直接可以生成图形化分析结果,包括模块间调用,函数调用流程等,确实比较震撼。 文章目录1.设置2.......
  • VBScript 动态 Array 的实现代码
    <p>记录一个小方法,关于VBScript中,动态Array的实现,也适用于VBA,</p>在很久以前,写VBA的时候,就觉得使用Array和不方便,因为大小固定,当时想的是,要是Array可以像Python里的list一样好用该多好啊,那么下面,就记录一个方法,能让Array变得动态,并......
  • 【视频】R语言支持向量回归SVR预测水位实例讲解|附代码数据
    全文链接:https://tecdat.cn/?p=35914原文出处:拓端数据部落公众号分析师:MiaoqiaoWang当我们面对样本需要建立相应模型时,使用传统统计方法建立模型需要大量的样本数据,只有在样本量足够大时,该模型才具有一定的可靠性,而实际实验中,不一定每次实验都拥有足够大的样本,甚至是小样本,这......
  • R语言预测期货波动率的实现:ARCH与HAR-RV与GARCH,ARFIMA模型比较|附代码数据
    全文下载链接:http://tecdat.cn/?p=3832最近我们被客户要求撰写关于期货波动率的研究报告,包括一些图形和统计输出。在本文中,波动率是众多定价和风险模型中的关键参数,例如BS定价方法或风险价值的计算。在这个模型中,或者说在教科书中,这些模型中的波动率通常被认为是一个常数然而,情......
  • 使用VBS创建快捷方式的代码
    <p>在网吧维护过程中经常要发送桌面快捷方式,有什么批处理的方式能便捷发送桌面快捷方式呢,就拿我这边网吧steam下发为例给大家一个参考,如果要使用直接复制下面代码改下具体参数就行了。代码如下:</p>@echooff::设置程序或文件的路径(必选)setProgram=D......