Matlab 将3列数据更改为二维绘图的矩阵形式
我的数据分为3列,分别表示x、y和z坐标的值。网格上的x点和y点可能不均匀,如下所示:Matlab 将3列数据更改为二维绘图的矩阵形式,matlab,matrix,Matlab,Matrix,我的数据分为3列,分别表示x、y和z坐标的值。网格上的x点和y点可能不均匀,如下所示: x y z 1 1 5 1 2 7 1 3 0 3 1 6 3 2 9 3 3 5 7 1 4 7 2 0 7 3 8 现在我想用一个MATLAB函数,比如pcolor,来绘制这个数据的2D颜色图,其中z值将用颜色表示。不幸的是,pcolor希望x和y坐标的数据作为向量或网格矩阵,z数据也以网格矩阵的形式出现,并且不会排除这种形式的列数据 我不想使用任何拟合或插值。我只想重新整理我这里的数据。我怎样才能
x y z
1 1 5
1 2 7
1 3 0
3 1 6
3 2 9
3 3 5
7 1 4
7 2 0
7 3 8
现在我想用一个MATLAB函数,比如pcolor,来绘制这个数据的2D颜色图,其中z值将用颜色表示。不幸的是,pcolor希望x和y坐标的数据作为向量或网格矩阵,z数据也以网格矩阵的形式出现,并且不会排除这种形式的列数据
我不想使用任何拟合或插值。我只想重新整理我这里的数据。我怎样才能做到这一点
X=reshape(data(:,1), [3 3]);
Y=reshape(data(:,2), [3 3]);
Z=reshape(data(:,3), [3 3]);
pcolor(X,Y,Z);
注意:这将生成一个具有4种颜色而不是9种颜色的矩阵,因为pcolor会删除一行和一列,但这是另一个问题
注意:这将生成一个具有4种颜色而不是9种颜色的矩阵,因为pcolor会删除一行和一列,但这是另一个问题。使用and的通用方法: unique的第三个输出可用作[X,Y]网格内位置的整数表示。功劳 与此相反,如果您的数据不在良好的网格上,此解决方案也可以工作,例如
data = [1 1 5;
5 2 7;
1 3 0;
3 1 6;
3 2 9;
3 7 5;
7 1 4;
7 2 0;
4 3 8];
OP的解决方案之所以有效,是因为当通过列主顺序重塑数据时,数据正好成为由meshgrid输出的坐标网格。当您的数据不是那么简单和漂亮时,使用重塑将得到一个非均匀的坐标矩阵。通用方法使用和: unique的第三个输出可用作[X,Y]网格内位置的整数表示。功劳 与此相反,如果您的数据不在良好的网格上,此解决方案也可以工作,例如
data = [1 1 5;
5 2 7;
1 3 0;
3 1 6;
3 2 9;
3 7 5;
7 1 4;
7 2 0;
4 3 8];
OP的解决方案之所以有效,是因为当通过列主顺序重塑数据时,数据正好成为由meshgrid输出的坐标网格。每当数据不是那么简单和漂亮时,使用“重塑”将得到一个非统一的坐标矩阵。如果这是为了打印目的,而运行时性能不是一个问题,我不会诉诸任何难以理解和维护的花式索引技巧 相反,我想推荐一个结合imagesc的好的旧for循环:
data = [
1 1 5
1 2 7
1 3 0
3 1 6
3 2 9
3 3 5
7 1 4
7 2 0
7 3 8
];
plt_data = NaN(max(data(:,2)), max(data(:,1)));
% iterate over the rows
for xyz = data'
plt_data(xyz(2), xyz(1)) = xyz(3);
end
imagesc(plt_data)
colorbar()
好的,如果你有负轴点的数据,那么它会变得更复杂:
data = [
1 -1 5
1 2 7
1 -3 1
3 1 6
-3 2 9
-3 -3 5
7 1 4
7 -2 1
7 3 8
];
x0 = min(data(:,1));
x1 = max(data(:,1));
y0 = min(data(:,2));
y1 = max(data(:,2));
xrange = x1 - x0;
yrange = y1 - y0;
plt_data = NaN(yrange, xrange);
% iterate over the rows
for xyz = data'
plt_data(xyz(2)-y0+1, xyz(1)-x0+1) = xyz(3);
end
imagesc(x0:x1, y0:y1, plt_data)
set(gca(), 'ydir', 'normal')
colorbar()
您可能希望翻转y轴,使其看起来像熟悉的笛卡尔轴:
如果这是出于绘图目的,而运行时性能不是一个问题,我不会诉诸任何难以理解和维护的花哨的索引技巧 相反,我想推荐一个结合imagesc的好的旧for循环:
data = [
1 1 5
1 2 7
1 3 0
3 1 6
3 2 9
3 3 5
7 1 4
7 2 0
7 3 8
];
plt_data = NaN(max(data(:,2)), max(data(:,1)));
% iterate over the rows
for xyz = data'
plt_data(xyz(2), xyz(1)) = xyz(3);
end
imagesc(plt_data)
colorbar()
好的,如果你有负轴点的数据,那么它会变得更复杂:
data = [
1 -1 5
1 2 7
1 -3 1
3 1 6
-3 2 9
-3 -3 5
7 1 4
7 -2 1
7 3 8
];
x0 = min(data(:,1));
x1 = max(data(:,1));
y0 = min(data(:,2));
y1 = max(data(:,2));
xrange = x1 - x0;
yrange = y1 - y0;
plt_data = NaN(yrange, xrange);
% iterate over the rows
for xyz = data'
plt_data(xyz(2)-y0+1, xyz(1)-x0+1) = xyz(3);
end
imagesc(x0:x1, y0:y1, plt_data)
set(gca(), 'ydir', 'normal')
colorbar()
您可能希望翻转y轴,使其看起来像熟悉的笛卡尔轴:
可能的副本。你自己对你的问题的回答让我觉得这个副本是有效的。@AndrasDeak,如果他的数据不是这种非常简单的[x,y]结构,你就需要完全其他的东西来让pcolor工作,请注意,你不应该也不应该这样在你的标题中添加语言名称:这就是标记的用途!可能的副本。你自己对你的问题的回答让我觉得这个副本是有效的。@AndrasDeak,如果他的数据不是这种非常简单的[x,y]结构,你就需要完全其他的东西来让pcolor工作,请注意,你不应该也不应该这样在你的标题中添加语言名称:这就是标记的用途!请注意,这仅在[x,y]坐标为正整数时有效。我添加了负坐标的情况。非整数呢?比如3.5,2.3,4作为坐标?不管怎样,对于OP提供的确切数据,您的解决方案运行良好。不知道他的实际数据是否更难。请注意,这只在[x,y]坐标为正整数时有效。我添加了负坐标的情况。非整数呢?比如3.5,2.3,4作为坐标?不管怎样,对于OP提供的确切数据,您的解决方案运行良好。不知道他的实际数据是否更困难。