从绘图中提取子图以绘制另一个图形并将变量分配给 Matlab 中的轴标签
Extracting subfigure from plots to plot another figure and assigning variable to axes labels in Matlab
我有一个代码如下:
clear; close all; clc;
SizeOfAxesAndPlotLine = 1.5;
SizeOfAxesAndLegendFont = 12;
%% 1st figure
x1 = 1:0.01:2;
y1 = 10:0.1:20;
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
subplot(3,1,1)
plot(x1,y1,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y1 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 1')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 2nd figure
x2 = 2:0.01:3;
y2 = 20:0.1:30;
subplot(3,1,2)
plot(x2,y2,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y2 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 2')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 3rd figure
x3 = 3:0.01:4;
y3 = 30:0.1:40;
subplot(3,1,3)
p3 = plot(x3,y3,'LineWidth',SizeOfAxesAndPlotLine);
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y3 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 3')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
% print('-dpng','Figure1');
%% 4th figure
x4 = 10:0.01:20;
y4 = 100:0.1:200;
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
subplot(3,1,1)
p4 = plot(x4,y4,'LineWidth',SizeOfAxesAndPlotLine);
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y4 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 4')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 5th figure
x5 = 20:0.01:30;
y5 = 200:0.1:300;
subplot(3,1,2)
plot(x5,y5,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y5 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 5')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 6th figure
x6 = 20:0.01:30;
y6 = 200:0.1:300;
subplot(3,1,3)
plot(x6,y6,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y6 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 6')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
% print('-dpng','Figure2');
这会产生 2 个数字,如下所示:
- 现在我想创建另一个图(第 3 个),将图 #3 和图 #4 放在一起。如何做到这一点?我期待我可以将变量分配给各个子图,包括轴(比如 p3 和 p4)并使用如下命令:
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
subplot(2,1,1)
p3
subplot(2,1,2)
p4
- 可以看出我起诉了
ylabel('y values');
六次。是否可以为它分配一个变量(比如 ylab
),然后在我想要的任何地方使用它?
我正在使用 Matlab 2016a。
让我们从第二部分开始 - 是的,很简单。只需将字符串分配给一个变量:
yLable = 'y values';
然后写:
ylabel(yLable);
关于第一个问题,你可以这样回答:
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
ax = subplot(2,1,1);
copyobj(p3,ax)
ax = subplot(2,1,2);
copyobj(p4,ax)
在这里,您获取子图的句柄(在 ax
中)并使用 copyobj
函数将具有所选句柄 (p3,p4
) 的行复制到其中。
但是,这不会复制整个坐标轴(带有标签等...),而只会复制直线。如果你想复制轴,你需要在层次结构中更上一层楼,并给你的图形一个句柄(下面的f3
)。此外,您还需要在代码的以下几行中获取坐标轴句柄:
...
ax3 = subplot(3,1,3) %<-note the assignment
p3=plot(x3,y3,'LineWidth',SizeOfAxesAndPlotLine)
...
ax4 = subplot(3,1,1) %<-note the assignment
p4=plot(x4,y4,'LineWidth',SizeOfAxesAndPlotLine)
...
然后将坐标轴复制到图中:
f3 = figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
copyobj(ax3,f3);
copyobj(ax4,f3);
这将保留每个 属性 轴,包括其在图中的位置,此处可能不需要(因为您使用不同的参数调用 subplot
)。为了解决这个问题,我们可以使用 subplot
创建空轴,获取其位置,将位置分配给复制的轴并将其删除。我们对复制的每个轴都这样做:
f3 = figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
axPos = subplot(2,1,1); % dummy axes 1
ax = copyobj(ax3,f3);
ax.Position = axPos.Position; % set the position to dummy axes 1
delete(axPos) % delete dummy axes 1
axPos = subplot(2,1,2); %<-dummy axes 2
ax = copyobj(ax4,f3);
ax.Position = axPos.Position; % set the position to dummy axes 2
delete(axPos) % delete dummy axes 2
我们得到:
我有一个代码如下:
clear; close all; clc;
SizeOfAxesAndPlotLine = 1.5;
SizeOfAxesAndLegendFont = 12;
%% 1st figure
x1 = 1:0.01:2;
y1 = 10:0.1:20;
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
subplot(3,1,1)
plot(x1,y1,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y1 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 1')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 2nd figure
x2 = 2:0.01:3;
y2 = 20:0.1:30;
subplot(3,1,2)
plot(x2,y2,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y2 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 2')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 3rd figure
x3 = 3:0.01:4;
y3 = 30:0.1:40;
subplot(3,1,3)
p3 = plot(x3,y3,'LineWidth',SizeOfAxesAndPlotLine);
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y3 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 3')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
% print('-dpng','Figure1');
%% 4th figure
x4 = 10:0.01:20;
y4 = 100:0.1:200;
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
subplot(3,1,1)
p4 = plot(x4,y4,'LineWidth',SizeOfAxesAndPlotLine);
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y4 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 4')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 5th figure
x5 = 20:0.01:30;
y5 = 200:0.1:300;
subplot(3,1,2)
plot(x5,y5,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y5 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 5')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
%% 6th figure
x6 = 20:0.01:30;
y6 = 200:0.1:300;
subplot(3,1,3)
plot(x6,y6,'LineWidth',SizeOfAxesAndPlotLine)
set(gca,'linewidth',SizeOfAxesAndPlotLine)% Changes width of the axes
xlabel('x values');
ylabel('y values');
legend({'Y6 Values'},'FontSize',SizeOfAxesAndLegendFont)
title('Plot # 6')
ax = gca;
ax.FontSize = SizeOfAxesAndLegendFont;
ax.YScale = 'log';
% print('-dpng','Figure2');
这会产生 2 个数字,如下所示:
- 现在我想创建另一个图(第 3 个),将图 #3 和图 #4 放在一起。如何做到这一点?我期待我可以将变量分配给各个子图,包括轴(比如 p3 和 p4)并使用如下命令:
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen subplot(2,1,1) p3 subplot(2,1,2) p4
- 可以看出我起诉了
ylabel('y values');
六次。是否可以为它分配一个变量(比如ylab
),然后在我想要的任何地方使用它?
我正在使用 Matlab 2016a。
让我们从第二部分开始 - 是的,很简单。只需将字符串分配给一个变量:
yLable = 'y values';
然后写:
ylabel(yLable);
关于第一个问题,你可以这样回答:
figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
ax = subplot(2,1,1);
copyobj(p3,ax)
ax = subplot(2,1,2);
copyobj(p4,ax)
在这里,您获取子图的句柄(在 ax
中)并使用 copyobj
函数将具有所选句柄 (p3,p4
) 的行复制到其中。
但是,这不会复制整个坐标轴(带有标签等...),而只会复制直线。如果你想复制轴,你需要在层次结构中更上一层楼,并给你的图形一个句柄(下面的f3
)。此外,您还需要在代码的以下几行中获取坐标轴句柄:
...
ax3 = subplot(3,1,3) %<-note the assignment
p3=plot(x3,y3,'LineWidth',SizeOfAxesAndPlotLine)
...
ax4 = subplot(3,1,1) %<-note the assignment
p4=plot(x4,y4,'LineWidth',SizeOfAxesAndPlotLine)
...
然后将坐标轴复制到图中:
f3 = figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
copyobj(ax3,f3);
copyobj(ax4,f3);
这将保留每个 属性 轴,包括其在图中的位置,此处可能不需要(因为您使用不同的参数调用 subplot
)。为了解决这个问题,我们可以使用 subplot
创建空轴,获取其位置,将位置分配给复制的轴并将其删除。我们对复制的每个轴都这样做:
f3 = figure('units','normalized','outerposition',[0 0 1 1]) % For full screen
axPos = subplot(2,1,1); % dummy axes 1
ax = copyobj(ax3,f3);
ax.Position = axPos.Position; % set the position to dummy axes 1
delete(axPos) % delete dummy axes 1
axPos = subplot(2,1,2); %<-dummy axes 2
ax = copyobj(ax4,f3);
ax.Position = axPos.Position; % set the position to dummy axes 2
delete(axPos) % delete dummy axes 2
我们得到: