本文主要是介绍Matlab实现画中画效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自:http://blog.sina.com.cn/s/blog_7ec5cc870100wtf3.html
在数据处理过程中经常需要将曲线某一部分的局部放大图与原图画在一起,翻了一些ilovematlab论坛的帖子,自己实现了一下。功能:在一个figure上显示一大一小两个axes即两个图,其中小图的位置可以拖动。具体思路如下:
function [h1, h2, hp1, hp2] = plotinplot( x1, y1, x2, y2, strlegend )
%PLOTINPLOT 在一个figure中显示画中画效果
% 函数形式:[h1, h2] = plotinplot( x1, y1, x2, y2, strlegend )
% x1,y1:在大图中显示的曲线的数据
% x2,y2:在小图中显示的曲线的数据
% strlegend:两个图的图例,为二维元胞数组形式{'legend1','legend2'}
% [h1, h2]:返回两个axes的句柄,可根据该句柄对图形进一步修改
% [hp1, hp2]:返回两个plot的句柄,可根据该句柄对曲线进一步修改
% Example:
% x=0:pi/10:2*pi;
% y1=sin(x);
% y2=cos(x);
% plotinplot(x,y2,x,y2,{'sin','cos'});
% 输入参数处理
if nargin == 0
x1=0:pi/50:2*pi;
y1=sin(x1);
x2=0:pi/50:2*pi;
y2=cos(x2);
end
if ~exist('strlegend','var')
strlegend={'大图中的曲线','小图中的曲线'};
end
% 在两个axes中分别画出对应的曲线
figure;
h1=axes();
hp1=plot(x1,y1,'b');
h2=axes('position',[0.3 0.2 0.3 0.3]);
hp2=plot(x2,y2,'r');
hold on;
h=[hp1; hp2];
legend(h,strlegend);
% 设置鼠标按下响应函数
arg.h1=h1;
arg.h2=h2;
set(h2, 'ButtonDownFcn', {@ButtonDown,arg});
end
function ButtonDown(src, evt, arg)
arg.OrgPt = get(arg.h1, 'CurrentPoint');
arg.OrgPos = get(arg.h2,'position');
set(gcf, 'WindowButtonMotionFcn', {@WindowButtonMotion,arg});
set(gcf, 'WindowButtonUpFcn', @WindowButtonUp);
end
function WindowButtonMotion(src, evt, arg)
currPt = get(arg.h1, 'CurrentPoint');
deltax=currPt(1,1)-arg.OrgPt(1,1);
deltay=currPt(1,2)-arg.OrgPt(1,2);
h1xlim=get(arg.h1,'xlim');
h1ylim=get(arg.h1,'ylim');
ratiox=deltax/(h1xlim(2)-h1xlim(1));
ratioy=deltay/(h1ylim(2)-h1ylim(1));
h1pos=get(arg.h1,'position');
h2pos=get(arg.h2,'position');
newx=arg.OrgPos(1)+ratiox*h1pos(3);
newy=arg.OrgPos(2)+ratioy*h1pos(4);
set(arg.h2,'position',[newx,newy,h2pos(3),h2pos(4)]);
end
function WindowButtonUp(src, evt)
set(gcf, 'WindowButtonMotionFcn', '');
set(gcf, 'WindowButtonUpFcn', '');
end
这篇关于Matlab实现画中画效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!