在Matlab中绘制一个类似于使用Gnuplot获得的曲面图?

时间:2011-03-04 05:29:49

标签: matlab graph plot spatial

更新

Link到我的测试数据集

我有一些这样的数据:

10.0 11.0 0.5
10.0 12.0 0.5
10.0 14.5 0.5
10.0 16.0 0.5
10.0 18.5 0.5
10.0 19.0 0.5
10.0 19.5 0.5
10.0 20.0 0.5

使用Gnuplot,我可以绘制以下图片:

enter image description here

使用我写的以下脚本:

set data style lines
set surface
set dgrid3d 30,30
set hidden3d
set ticslevel 0.8
set isosample 40,40

set view 60, 30, 1, 1
set contour base

splot "dataset" using 2:1:($3) notitle

我正在尝试对此图进行一些分析,所以想把它变成Matlab,但我不知道如何绘制它。我尝试将数据集导入Matlab,这是我能走多远。我正在加载文件并使用以下Matlab语句进行绘图:

load data
rangeY = floor(min(data(:,2))):.5:ceil(max(data(:,2)))
rangeX = floor(min(data(:,1))):.5:ceil(max(data(:,1)))
[X,Y] = meshgrid(rangeX,rangeY)
Z = griddata(data(:,1),data(:,2),data(:,3),X,Y, 'cubic')
surf(X,Y,Z)

enter image description here

图片看起来与我截然不同(轴范围,形状等)有人能告诉我如何获得类似于我通过Gnuplot获得的情节吗?

2 个答案:

答案 0 :(得分:3)

surf无法正常工作的原因是数据非常嘈杂,因为你会看到你是否打电话

plot3(data(:,1),data(:,2),data(:,3),'.')

因此,您首先需要对数据进行平滑处理(我猜,这也是gnuplot函数的作用)。以下是一种平滑数据的方法

%# set bin edges (maybe you want to do 5:10:205)
xEdge = 10:10:200;
yEdge = xEdge;

%# bin the data
xId = sum(bsxfun(@ge,data(:,1),xEdge(2:end-1)),2)+1;
yId = sum(bsxfun(@ge,data(:,2),yEdge(2:end-1)),2)+1;

%# average z within every bin
smoothData = accumarray([xId,yId],data(:,3),[length(xCenter),length(yCenter)],@mean);

%# remove bins with no data
smoothData(smoothData==0) = NaN;

%# bin centers
xCenter = (xEdge(1:end-1)+xEdge(2:end))/2;
yCenter = xCenter;

%# plot
meshc(xCenter,yCenter,smoothData)

enter image description here

答案 1 :(得分:1)

我很惊讶您的代码不起作用。我在我的一个数据集上尝试过它并且运行正常。作为第一个答案,我建议您发布指向数据集的链接(如果不敏感),并尝试其他插值方法(从默认值linear开始)。

然而,我注意到griddata在X-Y域的边界处产生了相当多的NaN,即使我的数据集非常密集并且在该域中分布良好。我检查了文档,并提到:

  

偶尔,griddata可能会将数据凸包上或非常靠近数据的返回点作为NaN。这是因为计算中的舍入有时会使得难以确定边界附近的点是否在凸包中。

我不认为这是你的问题的原因,但我仍然怀疑这个功能在非常稀疏的数据集上表现不佳。您应该尝试使用TriScatteredInterp,这反正会更快。