在Matlab中合并两个图形 [英] Merging two figures in Matlab
问题描述
我当前正在运行Matlab脚本(如下),该脚本会生成四个单独的图形.我想将这些图中的两个结合起来,以便同时显示它们.在下面的脚本中,我希望合并的图形分别称为图2和图4.
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.
该脚本的唯一输入是一个具有6列的txt文件:x坐标,y坐标和4个变量(深度[m],Hsig [m],周期[sec],方向[度])
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.
这篇关于在Matlab中合并两个图形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!