% 之前写论文的时候,出图用到了局部放大图,当时网上搜到了一个比较好用的函数:magnify.m文件。源自MathWorks社区,下载解压,画完图后载入该文件即可。
% 鼠标停放在想放大的区域,按住右键,此时鼠标点击处出现类似放大镜的方框,可以移动选择要放大的区域,通过'<'和'>'缩小或扩大方框范围,
% 通过'-'和'+'键减小或增加局部缩放比例,调整到自己想到的区域和缩放大小,松开右键即可。
% 重复上述可放大多个,将Figure调整到可选中状态,可移动局部放大图的放置位置。
% 这个方法用了挺久,也很好用,但是长宽比是不能改的,于是又找到了另外一种方法,即使用matlab自带函数:
% axes('Position',[subNormalxLabel,subNormalyLabel,normalWidth,normalHeight])
% 参数说明:
% subNormalxLabel 为子图左下角位置的归一化横坐标,subNormalxLabel为子图左下角位置的归一化纵坐标,计算公式为:
% subNormalxLabel = (该位置的横坐标-横坐标起始值)/横坐标量程
% subNormalyLabel = (该位置的纵坐标-纵坐标起始值)/纵坐标量程
% normalWidth为子图的归一化宽度,normalHeight为子图的归一化高度,计算方式类似。
% 创建坐标轴对象,那么在一张图中创新两个或多个不同的坐标轴,可实现局部放大功能,且可自己控制子图长宽比。
clear;close;
%先画第一个大图像
set(groot,'defaultAxesColorOrder',[0 0 0;1 0 0],...
'defaultAxesLineStyleOrder','--|-|:|-.');
% groot refers to the graphics root object——help
% 这里的设置对象(groot)不能是h1或h2,否则不起作用
% 设置绘制点线的样式和他们的顺序,这里设置的顺序依次为:
% 黑色虚线、红色虚线;黑色实线、红色实线;黑色点点、红色点点;黑色点线、红色点线
h1=axes('position',[0.08 0.1 0.85 0.85]); % 创建一个坐标系
%让 坐标轴的左下角 与 窗口左侧 的距离时窗口宽度的8%,距离下侧10%
%整个坐标轴的宽占85%,高占85%。一个小框就出来了
axes(h1); %将h1设置为当前坐标系,为绘图准备
Z = peaks; x = 1:length(Z);y = Z(3:10,:);
plot(x,y); axis(h1,[0,49,-6,0.5]); %坐标轴句柄h1不能少!
%画图 %x的坐标范围是0到2π,y的范围是-0.5到0.5
legend('黑色虚线','红色虚线','黑色实线','红色实线','黑色点点','红色点点','黑色点线','红色点线')
% 在原图上插入一个新的小图像
set(groot,'defaultAxesLineStyleOrder','remove','defaultAxesColorOrder','remove');
%每次使用记得清除上次设置的参数,否则设置的参数会被保留下来
h2=axes('Position',[0.15 0.15 0.3 0.3]);
% 建立的坐标轴把原来的覆盖了是吧?这说明建立坐标轴是在绘图(点、线)之前
axes(h2); % 将h2设置为当前坐标系
%plot(rand(10,3));
plot(x,y)
set(h2,'xlim',[10 15]);
%%%%%%%%%%%%%%%%%%%%%%%-------------案例2——
figure
axes('Position',[0.1,0.1,0.7,0.7])
contour(peaks(20))
axes('Position',[0.65,0.7,0.28,0.28])
surf(peaks(20))
先准备好一张图,然后直接在命令行里运行:
showdetail();
然后分为如下几部操作:
【1】这是事先准备好的一张图
【2】运行程序后选择ROI,即感兴趣的区域,双击左键确定
【3】选择你想要放置的地方,双击左键确定
【4】成品图
function showdetail()
% 在当前的axes上操作,用矩形框选出感兴趣的一
% 块区域然后在现有的axes里新建一axes将其画出
set(gcf,'color','white');
% 拿到axes在figure中的坐标值及其刻度值分布范围
Pos = get(gca,'Position');
X0 = Pos(1);
Y0 = Pos(2);
DX = Pos(3);
DY = Pos(4);
DLX = xlim;
DLY = ylim;
% 拿到axes中曲线数据
h = findobj(gcf,'Type','line');
xdata = get(h,'XData');
ydata = get(h,'YData');
Color = get(h,'Color');
LineStyle = get(h,'LineStyle');
LineWidth = get(h,'LineWidth');
Marker = get(h,'Marker');
MarkerSize = get(h,'MarkerSize');
MarkerEdgeColor = get(h,'MarkerEdgeColor');
MarkerFaceColor = get(h,'MarkerFaceColor');
% 选取需要放大显示的细节部分ROI
h1 = imrect; % 框选出需要的区域
wait(h1);
pos = getPosition(h1); % 返回区域的位置和大小
x0 = pos(1);
y0 = pos(2);
dx0 = pos(3);
dy0 = pos(4);
% 细节部分的下标
if iscell(xdata) == 0
indx1 = find( xdata >= x0 );
indx2 = find( xdata <= x0+dx0 );
indx = indx1(1):indx2(end);
else
m = length(xdata);
indx1 = find( xdata{1}>=x0 );
indx2 = find( xdata{1}<=x0+dx0 );
indx = indx1(1):indx2(end);
end
hold on;
LineX = x0:dx0/10:x0+dx0;
LineY = y0:dy0/10:y0+dy0;
plot(LineX,y0*ones(size(LineX)),'k');
plot(LineX,(y0 + dy0)*ones(size(LineX)),'k');
plot(x0*ones(size(LineY)),LineY,'k');
plot((x0+dx0)*ones(size(LineY)),LineY,'k');
h2 = imrect;
wait(h2);
pos = getPosition(h2);
x = pos(1);
y = pos(2);
dx = pos(3);
dy = pos(4);
xn = X0 + DX*(x - DLX(1))/( DLX(2) - DLX(1) );
yn = Y0 + DY*(y - DLY(1))/( DLY(2) - DLY(1) );
dxn = DX*dx / ( DLX(2) - DLX(1) );
dyn = DY*dy / ( DLY(2) - DLY(1) );
delete(h1);
delete(h2);
axes('Position', [xn yn dxn dyn]);
if iscell(xdata) == 0
plot(xdata(indx),ydata(indx),...
'Color',Color,...
'LineStyle',LineStyle,...
'LineWidth',LineWidth,...
'Marker',Marker,...
'MarkerSize',MarkerSize,...
'MarkerEdgeColor',MarkerEdgeColor,...
'MarkerFaceColor',MarkerFaceColor);
else
for i = 1:m
plot(xdata{i}(indx),ydata{i}(indx),...
'Color',Color{i},...
'LineStyle',LineStyle{i},...
'LineWidth',LineWidth{i},...
'Marker',Marker{i},...
'MarkerSize',MarkerSize{i},...
'MarkerEdgeColor',MarkerEdgeColor{i},...
'MarkerFaceColor',MarkerFaceColor{i});
hold on;
end
end
set( gca , 'Box', 'off');
axis([x0 x0+dx0 y0 y0+dy0]);
hold off;
end