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.
精彩评论