using subplot(m,n,p,ax) in a loop

6 ビュー (過去 30 日間)
Payal Bal
Payal Bal 2015 年 6 月 11 日
コメント済み: Ingrid 2017 年 2 月 3 日
Hi, If I have this plot
x = linspace(1,10);
y = sin(x);
plot(x,y)
title('Sine Plot')
And want to assign it to a subplot with the same axes, I will do
ax1 = gca;
subplot(2,1,1,ax1)
But now if I want a new plot at subplot(2,1,2) with the same axes, I can’t do
ax1 = gca;
subplot(2,1,2,ax1)
because it deletes the previous plot. How can I keep both plots?
Cheers, p.

採用された回答

Ingrid
Ingrid 2015 年 6 月 11 日
you cannot define an axes handle in a subplot command because the subplot command generates an axes
You should just write
h1 = subplot(2,1,1)
plot(h1,x1,y1)
h2 = subplot(2,1,2)
plot(h2,x2,y2)
  2 件のコメント
Payal Bal
Payal Bal 2017 年 2 月 3 日
Hi Ingrid,
Thanks for replying. I want to specify figure and axes properties outside of a loop and use subplot to plot the outputs from each run (with similar colours, axes limits etc.) of the loop in one plot window. If I specify figure and axes specifications within the loop, I get a new window for each plot.
Also I am using image() instead of plot so plot(h1,x1,x1) won't work.
Here's what I am trying to do (please ignore the colourmap matrix, it's this long because I had to customize it)
figure1 = figure('Colormap',...
[0.600000023841858 0.600000023841858 0.600000023841858;0.540000021457672 0.540000021457672 0.64000004529953;0.480000019073486 0.480000019073486 0.680000007152557;0.420000016689301 0.420000016689301 0.720000028610229;0.360000014305115 0.360000014305115 0.759999990463257;0.300000011920929 0.300000011920929 0.800000011920929;0.240000009536743 0.240000009536743 0.840000033378601;0.180000007152557 0.180000007152557 0.879999995231628;0.120000004768372 0.120000004768372 0.920000016689301;0.0600000023841858 0.0600000023841858 0.959999978542328;0 0 1;0 0.0909090936183929 1;0 0.181818187236786 1;0 0.272727280855179 1;0 0.363636374473572 1;0 0.454545468091965 1;0 0.545454561710358 1;0 0.636363625526428 1;0 0.727272748947144 1;0 0.818181812763214 1;0 0.909090936183929 1;0 1 1;0 0.954367220401764 0.909090936183929;0 0.908734381198883 0.818181812763214;0 0.863101601600647 0.727272748947144;0 0.817468822002411 0.636363625526428;0 0.77183598279953 0.545454561710358;0 0.726203203201294 0.454545468091965;0 0.680570423603058 0.363636374473572;0 0.634937584400177 0.272727280855179;0 0.589304804801941 0.181818187236786;0 0.543672025203705 0.0909090936183929;0 0.498039215803146 0;0.100000001490116 0.548235297203064 0;0.200000002980232 0.598431348800659 0;0.300000011920929 0.648627460002899 0;0.400000005960464 0.698823511600494 0;0.5 0.749019622802734 0;0.600000023841858 0.79921567440033 0;0.699999988079071 0.84941178560257 0;0.800000011920929 0.899607837200165 0;0.899999976158142 0.949803948402405 0;1 1 0;1 0.9454545378685 0;1 0.890909075737 0;1 0.836363613605499 0;1 0.781818211078644 0;1 0.727272748947144 0;1 0.672727286815643 0;1 0.618181824684143 0;1 0.563636362552643 0;1 0.509090900421143 0;1 0.454545468091965 0;1 0.400000005960464 0;0.959999978542328 0.360000014305115 0;0.920000016689301 0.319999992847443 0;0.879999995231628 0.280000001192093 0;0.840000033378601 0.240000009536743 0;0.800000011920929 0.200000002980232 0;0.759999990463257 0.159999996423721 0;0.720000028610229 0.120000004768372 0;0.680000007152557 0.0799999982118607 0;0.64000004529953 0.0399999991059303 0;0.600000023841858 0 0]);
axes1 = axes('Parent',figure1,'Layer','top','FontSize',18,'CLim',[0 6]);
Within loop:
% Subplot 1
figure(1)
subplot(4,3,i,axes1); % i is the counter of the loop for example
xlim (axes1,[0 1]);
ylim (axes1,[0 100]);
box(axes1,'off');
hold(axes1,'all')
h=image(x,y,z,'Parent',axes1,'CDataMapping','scaled');
set(h,'alphadata',~isnan(z))
colorbar;
% Subplot2
figure(1)
subplot(4,3,i+3,axes1);
xlim (axes1,[0 1]);
ylim (axes1,[0 100]);
box(axes1,'off');
hold(axes1,'all')
h=image(x,y,z,'Parent',axes1,'CDataMapping','scaled');
set(h,'alphadata',~isnan(z))
colorbar;
So basically, I want to plot an image the properties of which I want to specify beforehand, and each image is an output from one step of a for loop. I therefore want to make a plot window and send the output images to their respective subplot locations. I hope this makes sense.
Cheers, p.
Ingrid
Ingrid 2017 年 2 月 3 日
when you type
doc image
you can learn that what you want is to not generate a new plot (A high-level function that calls newplot to determine where to draw the graphics objects and sets the following axes properties) as you are currently doing, but that you require A low-level function that adds the image to the current axes without calling newplot. The low-level function argument list can contain only property name/property value pairs. So basically you have to change your call to image so that you are plotting to the currently selected axes
hFig = figure;
for i= 1:12
% Subplot 1
figure(1)
hAX(i) = subplot(4,3,i); % i is the counter of the loop for example
xlim (hAX(i),[0 1]);
ylim (hAX(i),[0 100]);
box(hAX(i),'off');
hold(hAX(i),'all')
image('PropertyName',PropertyValue,...) % fill in for your specific case
colorbar;
end

サインインしてコメントする。

その他の回答 (1 件)

Salaheddin Hosseinzadeh
Salaheddin Hosseinzadeh 2015 年 6 月 11 日
Just put figure outside the loop.
If you want to change each axis or maybe axes properties, use xlim ylim in your for loop you can only have
for i = 1:N
subplot(1,N);
plot(data);
xlim([-x,x]);
ylim([-y,y]);
end
something like this
  1 件のコメント
Payal Bal
Payal Bal 2015 年 6 月 13 日
Thanks. Yes was doing it all wrong.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeSubplots についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by