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
posted @ 2024-04-17 12:18    阅读(162)  评论(0编辑  收藏  举报