开发者

Merging two figures in Matlab

I am currently running开发者_开发百科 a Matlab script (below) which produces four seperate graphs. I want to combine two of these graphs so that the are displayed simultaneously. The graphs I wish to combine i referred to as FIGURE 2 and FIGURE 4 in the below script.

The only input to the script is a txt file with 6 columns: x coordinates, y-coordinates and 4 variables (Depth [m], Hsig [m] , Period [sec] , Dir [degrees])

Any help on this would be greatly appreciated.

% Post-process a SWAN wave model output file
%----------------------------------------------------------------------------------------------
%defaults
N_header = 7; % header lines in SWAN file
N_vars = 6;           %output variables in SWAN file
x_origin = 0;    %real world x origin
y_origin = 0;   %real world y origin
quiver_subsample = 6; %sub-sampling factor to make direction plot clearer
rot_angle = 0; %rotation angle to correct any previous rotation for SWAN
island_mask = load('island_mask.txt'); %mask for islands (set land to NaN);

%specify input file
[filename,pathname] = ...
  uigetfile('*.txt', 'Specify SWAN results file (e.g. Scilly.txt) [*.txt]');
  SWANfile = fullfile(pathname,filename);

%read (and ignore) file header lines
fid = fopen(SWANfile);
for i=1:N_header
 head = fgets(fid);
end
%and now get the data
data = fscanf(fid,'%g %g',[N_vars inf]); data = data';
fclose(fid);

%extract the datasets we want, marking any junk values (e.g. dry land)
XP = data(:,1);
YP = data(:,2);

DEPTH = data(:,3);
dudsDEPTH = (DEPTH==-99);
DEPTH(dudsDEPTH) = NaN;

HS = data(:,4);
dudsHS = (HS==-9);
HS(dudsHS) = NaN;

PER = data(:,5);
dudsPER = (PER==-9);
PER(dudsPER) = NaN;

DIR = data(:,6);
dudsDIR = (DIR==-999);
DIR(dudsDIR) = NaN;

minX = min(XP);
minY = min(YP);
maxX = max(XP);
maxY = max(YP);
cellsize = XP(2) - XP(1);

% mesh and plot data onto scaled output grids
[xp,yp] = meshgrid(minX:cellsize:maxX,minY:cellsize:maxY);

sx = size(xp); xlen = sx(2); ylen = sx(1);
depth = reshape(DEPTH,xlen,ylen);
hs = reshape(HS,xlen,ylen);
per = reshape(PER,xlen,ylen);
dir = reshape(DIR,xlen,ylen);

depth_rot = flipud(rot90(depth,1));%pcolor(depth_rot);shading flat
hs_rot = flipud(rot90(hs,1));%pcolor(hs_rot);shading flat
per_rot = flipud(rot90(per,1));%pcolor(per_rot);shading flat
dir_rot = flipud(rot90(dir,1));
%remember that actual directions also need rotating (i.e. not just matrix!)
dir_rot = dir_rot + rot_angle; %pcolor(dir_rot);shading flat

xp_rot = xp;
yp_rot = yp;

%create x and y matrices in real world co-ordinates
xp_rot = xp_rot + x_origin;
yp_rot = yp_rot + y_origin;

%and equivalent x and y vectors, in case we need these instead
grid_cells = size(xp_rot);
x_cells = grid_cells(2); %columns
y_cells = grid_cells(1); %rows
x_utm = x_origin:cellsize:x_origin + (x_cells*cellsize);
y_utm = y_origin:cellsize:y_origin + (y_cells*cellsize); 
% y_utm = fliplr(y_utm); % flip to ensure cartesian rather than image axes


%create bathymetry plot
figure(1)
if ~isempty(island_mask)
 depth_rot_plot = depth_rot;
 depth_rot_plot(island_mask) = NaN;
 imagesc(x_utm,y_utm,depth_rot_plot)
 colormap(jet(256));
 map = colormap;
 map(1,:) = 1;
 % map(2,:) = 1;
 % map(3,:) = 1;
 colormap(map); 
else
 imagesc(x_utm,y_utm,depth_rot)
end
title('Bathymetry (m)', 'fontsize', 12)
set(gca,'fontsize', 12);
axis equal
axis tight
axis xy % need this to ensure cartesian rather than image axes!
colorbar

%create direction plot
figure(2)
[U,V] = pol2cart((dir_rot) ./ (180/pi),ones(size(dir_rot)));
% and sub-sample output grid to produce clearer plot
U_subsample = nestedsubsample2(U,quiver_subsample);
V_subsample = nestedsubsample2(V,quiver_subsample);
X_subsample = nestedsubsample2(xp,quiver_subsample);
Y_subsample = nestedsubsample2(yp,quiver_subsample);
quiver(X_subsample,Y_subsample,U_subsample,V_subsample,'k');
title('Direction')
axis equal
axis tight

%visualise wave breaking by taking ratio of Hs and depth
breaking = hs_rot ./ depth_rot;
breaking(breaking > 0.7) = 0.70;

%create Hb/depth plot to show where waves are shoaling and/or breaking
figure(3)
imagesc(x_utm,y_utm,breaking)
title('Hs / depth', 'fontsize', 12)
set(gca,'fontsize', 12);
axis equal
axis tight
axis xy % need this to ensure cartesian rather than image axes!
colorbar


%create Hs plot
figure(4)
imagesc(x_utm,y_utm,hs_rot)
title('Hs (m)', 'fontsize', 12)
set(gca,'fontsize', 12);
axis equal
axis tight
axis xy % need this to ensure cartesian rather than image axes!
colorbar


function [subsampled_A] = nestedsubsample2(A,I)
%NESTEDSUBSAMPLE2(A,I)
%resample 2D matrix A by retaining every Ith element

if I < 1
 I = 1;
end

A_dim = size(A);
new_i = 1:I:A_dim(1);
new_j = 1:I:A_dim(2);

subsampled_A = A(new_i,new_j);

end


end


If you want multiple graphs to appear on separate axes in the same figure, you can use the SUBPLOT command. This will allow you to tile axes within a figure window.

If you want multiple graphs to appear on the same axes, you can use the HOLD command.


subplot(m,n,p) confused me for a little while so in case anyone else had
same mental block, I thought I'd put in my two cents

the m,n values set up numbers of rows and columns within a figure
the p   value  determines which subplot you are accessing 
               subplots are numbered   1 ..  n in row 1
                                     n+1 .. 2n in row 2
                                    2n+1 .. 3n in row 3   etc

For example for a 3 row 2 column set of figures you would access each location like this:

+-----------------------------------+
| subplot(3,2,1)  |  subplot(3,2,2) |
|-----------------+-----------------+
| subplot(3,2,3)  |  subplot(3,2,4) |
|-----------------+-----------------+
| subplot(3,2,5)  |  subplot(3,2,6) |
|-----------------------------------+

after the each subplot(m,n,p) call then you can do you normal plot(), title(), legend(), etc
calls and it draws the plot in the specified subplot postion


Here's an easy implementation of gnovice's suggested use of subplot.

For example, say you want figures 3 and 4 in the same figure window, side by side:

figure(3)

%create Hb/depth plot to show where waves are shoaling and/or breaking
subplot(1,2,1)
imagesc(x_utm,y_utm,breaking)
title('Hs / depth', 'fontsize', 12)
set(gca,'fontsize', 12);
axis equal
axis tight
axis xy % need this to ensure cartesian rather than image axes!
colorbar

%create Hs plot
subplot(1,2,2)
imagesc(x_utm,y_utm,hs_rot)
title('Hs (m)', 'fontsize', 12)
set(gca,'fontsize', 12);
axis equal
axis tight
axis xy % need this to ensure cartesian rather than image axes!
colorbar

I don't have access to my MATLAB computer right now, so I can't check that for you, but assuming your code written above works fine, this should as well.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜