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);
elsem = length(xdata);indx1 = find( xdata{1}>=x0 );indx2 = find( xdata{1}<=x0+dx0 );indx = indx1(1):indx2(end);
endhold 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);
elsefor i = 1:mplot(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;endend
set( gca , 'Box', 'off');
axis([x0 x0+dx0 y0 y0+dy0]);
hold off;end
MATLAB图中图局部放大几种方法相关推荐
- 在MATLAB的figure图中画局部放大的图中图
在MATALB绘图中,有时会遇到这样的情况,需要通过放大figure图的局部,针对细节加以说明.例如:在给定的尺度下有两条或多条曲线难以区别,此时就需要对其进行局部放大来加以区分.参考网上的解决方法1 ...
- matlab画一个局部放大的图中图
局部放大的图中图 第一种:magnify是个动态放大镜,固化后可以用tools>editplot移动小图,能选取多个局部图,这个方法不错 用法:打开figure图,输入magnify,左键动态选 ...
- 用旭日图展示数据的三种方法
什么是旭日图? 旭日图(Sunburst Chart)是一种现代饼图,它超越传统的饼图和环图,能表达清晰的层级和归属关系,以父子层次结构来显示数据构成情况.旭日图中,离远点越近表示级别越高,相邻两层中 ...
- MATLAB中使用magnify做图中图
网上一般有三种方法在MATLAB中做图中图,但是我感觉使用magnify是magnify是个动态放大镜,固化后可以用tools>edit plot移动小图,能选取多个局部图.下面详细讲解其使用方 ...
- 在MATLAB中生成矩阵的三种方法
在MATLAB中生成矩阵的三种方法 1. 直接输入法 2. 外部文件读入法 3.特殊矩阵函数生成法 1. 直接输入法 (1)矩阵所有元素必须在[]内 (2)矩阵中同行元素以逗号','或空格分隔 (3) ...
- 怎样能让计算机桌面软件变小,win7系统桌面图标如何变小?win7系统把桌面图标变小的4种方法...
win7系统桌面图标如何变小?有些用户升级win7系统后发现桌面图标很大,与之前xp系统有很大区别,看着不舒服,win7系统桌面图标如何变小?其实把桌面变小有很多方法,下面小编一一向大家win7系统把 ...
- 14_面向对象API绘图、图中图 (A Plot inside of Another Plot)、设定绘图范围Setting the Plot Range、对数尺度Logarithmic Scale
14.面向对象API绘图 14.1.图中图 (A Plot inside of Another Plot) 14.2.设定绘图范围 (Setting the Plot Range) 14.3.对数尺度 ...
- 用matlab设计fir高阶滤波器,用matlab设计fir滤波器的三种方法.doc
用matlab设计fir滤波器的三种方法.doc 用MATLAB信号处理工具箱进行FIR滤波器设计的三种方法摘要介绍了利用MATLAB信号处理工具箱进行FIR滤波器设计的三种方法程序设计法.FDATO ...
- Python画图(直方图、多张子图、二维图形、三维图形以及图中图)
Python画图很方便,不管是平时的学习还是教学当中,都将经常用到,特别直观,其中主要用到两个常用的库,一个二维和三维的:matplotlib.pyplot,mpl_toolkits.mplot3d ...
- OpenCV精进之路(零):访问图像中像素的三种方法
访问像素的三种方法 指针访问:最快 迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 这里 ...
最新文章
- JQuery Datatable用法
- 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...
- BZOJ5319 洛谷4559 LOJ2551:[JSOI2018]军训列队——题解
- SQL Server查询某个字段存在哪些表中
- 复习笔记(七)——C++友元
- 安卓dalvik和art区别
- 【Elasticsearch】es 7.8.0 唐诗三百首写入 Elasticsearch 会发生什么
- 切换回Chrome上的上次标签及打开设置快捷键
- perl linux 独立运行,Perl脚本打包为独立执行程序
- 15款最好用的新浪短链接(t.cn接口)在线生成工具
- 计算机登录界面没有用户显示不出来,win7让administrator账户不出现在登陆界面方法...
- 简单易懂的讲解深度学习(入门系列之八)
- 关于 npm publish问题
- stm32获取心知天气使用cJSON提取需要数据
- 哪款视频压缩软件比较好用?
- Python自动化实践
- Java中if条件语句举例详解
- 计算机三级网络技术最全知识点总结【5】
- 【回溯】leetcode1219.黄金矿工
- 计算机专业学生给家长的一封信,大学致家长的一封信