Matlab 将3列数据更改为二维绘图的矩阵形式

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数据也以网格矩阵的形式出现,并且不会排除这种形式的列数据 我不想使用任何拟合或插值。我只想重新整理我这里的数据。我怎样才能

我的数据分为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=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提供的确切数据,您的解决方案运行良好。不知道他的实际数据是否更困难。