lxx244lxx 发表于 2011-4-21 21:44

matlab 怎么分别提取figure子图中曲线的数据

lh=findall(gca,'type','line'); % 从当前图(gca)中取出曲线的handle
xc=get(lh,'xdata'); % 取出x轴数据,注意,这个x和y是以cell的数据结构保存的
yc=get(lh,'ydata');
这样只能得到第二条线上的数据

meiyongyuandeze 发表于 2011-4-22 00:40

回复 1 # lxx244lxx 的帖子

看了下help文件,并做了个例子,代码如下:

clc;clear
x=1:10;
y1=x.^2;
y2=x.^3;
subplot(2,1,1)
plot(x,y1)
subplot(2,1,2)
plot(x,y2)
figure_info=findall(gcf,'type','line');
xc1=get(figure_info(1,:),'xdata')
xc2=get(figure_info(2,:),'xdata')
yc1=get(figure_info(1,:),'ydata')
yc2=get(figure_info(2,:),'ydata')
运行的结果:
xc1 =
1 2 3 4 5 6 7 8 9 10
xc2 =
1 2 3 4 5 6 7 8 9 10
yc1 =
1 8 27 64 125 216 343 512 729 1000
yc2 =
1 4 9 16 25 36 49 64 81 100

这样就可以将所有子图中的曲线信息都找出来。
对比了findall help文件,其中findall中的handle_list可以是一下几种:
gcf 返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的 任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中。




lxx244lxx 发表于 2011-4-22 09:40

回复 2 # meiyongyuandeze 的帖子

谢谢啊,将gca改成gcf就行了,对了,如果想在曲线上取100个点或几十个点又改怎么设定呢

meiyongyuandeze 发表于 2011-4-22 09:55

figure_info=findall(gcf,'type','line');
xc1=get(figure_info(1,:),'xdata')
xx=xc1(N:M)M-N是你要取的个数!

sunminmin 发表于 2011-5-8 17:39

回复 2 # meiyongyuandeze 的帖子

曲线可以提取出坐标,三维图该如何提取?
生成这个三维图的代码:
CeatHill.m
function =CeatHill(N,h,x0,y0,xi,yi,num)
%创建小山丘模型,N座山,H为山的高度,X0,Y0为山的坐标。XI,YI为山丘的斜度,NUM为山丘模型数据的维数。
%XI,YI的值越大,山丘就越平坦
% Example:
% tic;
% h=;
% x0=;
% y0=;
% xi=[];
% yi=[];
% d=CeatHill(3,h,x0,y0,xi,yi,65);
% colormap(gray); %设置渲染的颜色
% surf(d); %画出三维曲面
% shading flat; %各小曲面之间不要网格
% toc %测试运行时间
x=1:1:num;y=1:1:num;
%z2=zeros(1,4);
for m=1:num
for n=1:num
Sum=0;
for k=1:N
s=h(k)*exp(-((x(m)-x0(k))/xi(k))^2-((y(n)-y0(k))/yi(k))^2);
Sum=Sum+s;
end
data(m,n)=Sum;
end
end
xlabel('X(单位:千米)')
ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')


SquareDiamond.m


function =SquareDiamond(N,initvalue,c)
%输入N为:方阵的维数2^N+1,在方阵的四个角的顶点上放置的初值,
%这里定为四个初值一样
% Example:
% tic;
% d=SquareDiamond(8,5,0.5);
% colormap(gray); %设置渲染的颜色
% surf(d); %画出三维曲面
% shading flat; %各小曲面之间不要网格
% toc %测试运行时间

n=2^N;
data=zeros(n+1);
data(1,1)=initvalue;
data(1,n+1)=initvalue;
data(n+1,1)=initvalue;
data(n+1,n+1)=initvalue;
data=mytry(data,n,c,n);

function =rnd(absvalue)
%扩展的随机函数生成器,产生绝对值小于absvalue的随机实数
x=(rand(1)-0.5)*2*absvalue;

function =mytry(data,m,r,n)
%square=========================================
%x-------x
%---------
%-- 0 -- 由四个x定中间的0
%---------
%x-------x
for i=1:m:n
for j=1:m:n
data((i+i+m)/2,(j+j+m)/2)=(data(i,j)+data(i,j+m)+data(i+m,j)+data(i+m,j+m))/4+rnd(r);
end
end
%diamond========================================
%----x--
%-----
%x- 0 -x 由四个x定中间的0
%--------
%----x---

%钻石步骤的横向部分
%line No.1
for j=1+m/2:m:n
data(1,j)=(data(1,j+m/2)+data(1+m/2,j)+data(1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
end
%middle
for i=1+m:m:n
for j=1+m/2:m:n
data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
end
end
%line last
for j=1+m/2:m:n
data(n+1,j)=(data(n+1,j+m/2)+data(1+m/2,j)+data(n+1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
end

%钻石步骤的纵向部分
%line No.1
for i=1+m/2:m:n
data(i,1)=(data(i,1+m/2)+data(i+m/2,1)+data(i,n+1-m/2)+data(i-m/2,1))/4+rnd(r);
end
%middle
for i=1+m/2:m:n
for j=1+m:m:n
data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
end
end
% line last
for i=1+m/2:m:n
data(i,n+1)=(data(i,1+m/2)+data(i+m/2,n+1)+data(i,n+1-m/2)+data(i-m/2,n+1))/4+rnd(r);
end

if (m>2)
data=mytry(data,m/2,r/2,n); %递归
end



createmap.m
clc
clear all
close all
%map1 随机地表。
Z1=SquareDiamond(6,2,8);
figure(1);
surf(Z1); %画出三维曲面
shading flat; %各小曲面之间不要网格
xlabel('X(单位:千米)')
ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')
%map2 山峰图
h=;
x0=;
y0=;
xi=;
yi=;
Z2=CeatHill(3,h,x0,y0,xi,yi,65);
figure(2);
surf(Z2); %画出三维曲面
shading flat; %各小曲面之间不要网格
xlabel('X(单位:千米)')
ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')
%map3 合成图
Z3=max(Z1,Z2);
figure(3);
surf(Z3); %画出三维曲面
shading flat; %各小曲面之间不要网格
xlabel('X(单位:千米)')
ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')




meiyongyuandeze 发表于 2011-5-8 20:52

帮你看了下,请你首先运行的你程序,将figure1-2关闭,并在command窗口中运行下面的代码: figure_info=findall(gcf,'type','surf');
xx=get(figure_info,'xdata');
yy=get(figure_info,'ydata');
z=get(figure_info,'zdata');
=size(z);
=meshgrid(xx,yy);
xyz=;上面的程序就是相对应的三维图形的坐标。
我运行过了,没问题,有结果输出。不知道你是不是这个意思!

sunminmin 发表于 2011-5-8 21:13

回复 6 # meiyongyuandeze 的帖子

非常感谢!就是你说的意思,我就是要得到figure3的图形坐标。谢谢!

meiyongyuandeze 发表于 2011-5-8 23:12

回复 7 # sunminmin 的帖子

不客气,一起学习

sunminmin 发表于 2011-5-9 15:57

回复 8 # meiyongyuandeze 的帖子

运行createmap.m文件之后会生成三维图,关闭figure1,figure2,下一步在Command Window中键入:
figure_info=findall(gcf,'type','surf');
xx=get(figure_info,'xdata');
yy=get(figure_info,'ydata');
z=get(figure_info,'zdata');
=size(z);
=meshgrid(xx,yy);
xyz=;
save map.txt xyz -ascii;

就将figure3的三维图的坐标保存到map.txt中了,map.txt数据格式为每一行为一个坐标(x,y,z)
1.0000000e+0001.0000000e+0002.0000000e+000
1.0000000e+0002.0000000e+0002.4651125e+000
1.0000000e+0003.0000000e+0002.4267769e+000
1.0000000e+0004.0000000e+0002.6111429e+000

通过这些点的坐标(x,y,z)绘制出它表示的三维图,我在commond窗口中键入:

%% 1 打开文件
=uigetfile('*.txt','选择文件!!!!');
file = ;
fid = fopen(file,'rt');
if fid == -1
error('文件打开错误。')
end
%% 2 提取
mynumber = [];
while 1
nextline = fgetl(fid);
if ~isstr(nextline), break, end
disp(nextline);
a=sscanf(nextline, '%f');
mynumber=
end
numplot=mynumber(:);
plot(numplot);
在窗口显示很长一列数据,只得到一个二维图,并不是三维的,这是怎么回事?


最好能在VC++下调用matlab引擎实现用map.txt绘制出它表示的图形,能同时了解matlab与vc++混合编程利用matlab引擎做演示用的效果。
期待您的答复,谢谢!

sunminmin 发表于 2011-5-9 18:38

回复 9 # sunminmin 的帖子

自己解决了,呵呵load map.txt;
maxX=max(map(:,1)); minX=min(map(:,1));
maxY=max(map(:,2)); minY=min(map(:,2));
xline=linspace(minX,maxX,81);%设置步长为1
yline=linspace(minY,maxY,81);%设置步长为1
=meshgrid(xline,yline);
Z=griddata(map(:,1),map(:,2),map(:,3),X,Y);
surf(Y,X,Z);
shading flat
%xlabel('X(单位:千米)')
%ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')

sunminmin 发表于 2011-5-9 18:51

回复 10 # sunminmin 的帖子

      

vesper305 发表于 2012-3-3 10:35

好贴~正好也解决了我的问题~~

永云俊南 发表于 2012-3-26 12:51

好贴~正好也解决了我的问题~~
呵呵,学习了!!

ChaChing 发表于 2012-3-27 01:18

Ref: 两个现有的fig图画在一起比较 或抓取axes数据 http://forum.vibunion.com/thread-83833-1-1.html
页: [1]
查看完整版本: matlab 怎么分别提取figure子图中曲线的数据