MATLAB图中图局部放大几种方法

% 之前写论文的时候,出图用到了局部放大图,当时网上搜到了一个比较好用的函数: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

 

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值