使用存储在向量中的坐标和数据生成热图
Generate heatmap with coordinates and data stored in vectors
设 A 是一个 n 乘 3 的矩阵,因此前两列都是形式为 (5*i,5*i) 的有序对,其中 i 从 1 到 200。第三列包含从 0 开始的值到 1,我称之为强度。我想制作一个 1000 x 1000 的绘图,以便 (5*i,5*i) 处的矩形使用第三列条目描述的强度进行着色。
我熟悉热图函数和 imshow,但我看不出有什么方法可以包含此 "scaling by 5" 来制作精美的图。当然,通常 x 和 y 坐标可能不会按相同的比例缩放。
有没有在 Matlab 中做这个的好方法?
有了imagesc
其实很简单:
首先是一些示例数据:
%// generate example data
ii = 1:200;
[xx,yy] = meshgrid(ii);
A(:,1) = 5*xx(:);
A(:,2) = 5*yy(:);
A(:,3) = randi([0,1],1,40000);
实际答案
n = 200;
%// reshape data
D = reshape( A(:,3),n,n );
%// heatmap
imagesc(A(:,1),A(:,2),D)
colormap(gray)
caxis([0,1])
给出:
重要通知
如果您的坐标没有按照 imagesc
的要求排序,您可以使用以下方法对它们进行排序:
A = sortrows(A,[2,1]);
小丑例子
%// original image
load clown
I = reshape(1:numel(X),size(X));
[R,C] = ind2sub(size(X),I);
A(:,1) = R(:);
A(:,2) = C(:);
A(:,3) = X(:);
D = reshape( A(:,3),200,320 );
figure(1)
subplot(1,3,1)
imagesc(A(:,1),A(:,2),D)
%// shuffled image -> shuffled data
shuffle = randperm(320*200);
A = A(shuffle,:);
D = reshape( A(:,3),200,320 );
subplot(1,3,2)
imagesc(A(:,1),A(:,2),D)
%// sorted image
A = sortrows(A,[2,1]);
D = reshape( A(:,3),200,320 );
subplot(1,3,3)
imagesc(A(:,1),A(:,2),D)
你看,即使你的坐标排序得乱七八糟,你也可以用sortrows
重建图像。
见this
function DrawHeatmap(X,Y,Z)
%DRAWHEATMAP Draw a 2D heatmap for (X,Y) coordinates whose values are in Z
% X, Y , Z must be columns
% By: Eng. Osama Talaat Abdel-Hafiz - PhD Student
% Egypt - Sept 2017
if size(X,2)==1 && size(Y,2)==1 && size(Z,2)==1
F = scatteredInterpolant(X,Y,Z); % create a function from interpolation
[X,Y] = meshgrid(min(X):0.1:max(X),min(Y):0.1:max(Y));
Z = F(X,Y);
contourf(X, Y, Z, linspace(floor(min(min(Z))),ceil(max(max(Z))),400), 'LineColor','none')
colorbar;
else
error('X, Y , Z must be columns')
end
end
设 A 是一个 n 乘 3 的矩阵,因此前两列都是形式为 (5*i,5*i) 的有序对,其中 i 从 1 到 200。第三列包含从 0 开始的值到 1,我称之为强度。我想制作一个 1000 x 1000 的绘图,以便 (5*i,5*i) 处的矩形使用第三列条目描述的强度进行着色。
我熟悉热图函数和 imshow,但我看不出有什么方法可以包含此 "scaling by 5" 来制作精美的图。当然,通常 x 和 y 坐标可能不会按相同的比例缩放。
有没有在 Matlab 中做这个的好方法?
有了imagesc
其实很简单:
首先是一些示例数据:
%// generate example data
ii = 1:200;
[xx,yy] = meshgrid(ii);
A(:,1) = 5*xx(:);
A(:,2) = 5*yy(:);
A(:,3) = randi([0,1],1,40000);
实际答案
n = 200;
%// reshape data
D = reshape( A(:,3),n,n );
%// heatmap
imagesc(A(:,1),A(:,2),D)
colormap(gray)
caxis([0,1])
给出:
重要通知
如果您的坐标没有按照 imagesc
的要求排序,您可以使用以下方法对它们进行排序:
A = sortrows(A,[2,1]);
小丑例子
%// original image
load clown
I = reshape(1:numel(X),size(X));
[R,C] = ind2sub(size(X),I);
A(:,1) = R(:);
A(:,2) = C(:);
A(:,3) = X(:);
D = reshape( A(:,3),200,320 );
figure(1)
subplot(1,3,1)
imagesc(A(:,1),A(:,2),D)
%// shuffled image -> shuffled data
shuffle = randperm(320*200);
A = A(shuffle,:);
D = reshape( A(:,3),200,320 );
subplot(1,3,2)
imagesc(A(:,1),A(:,2),D)
%// sorted image
A = sortrows(A,[2,1]);
D = reshape( A(:,3),200,320 );
subplot(1,3,3)
imagesc(A(:,1),A(:,2),D)
你看,即使你的坐标排序得乱七八糟,你也可以用sortrows
重建图像。
见this
function DrawHeatmap(X,Y,Z)
%DRAWHEATMAP Draw a 2D heatmap for (X,Y) coordinates whose values are in Z
% X, Y , Z must be columns
% By: Eng. Osama Talaat Abdel-Hafiz - PhD Student
% Egypt - Sept 2017
if size(X,2)==1 && size(Y,2)==1 && size(Z,2)==1
F = scatteredInterpolant(X,Y,Z); % create a function from interpolation
[X,Y] = meshgrid(min(X):0.1:max(X),min(Y):0.1:max(Y));
Z = F(X,Y);
contourf(X, Y, Z, linspace(floor(min(min(Z))),ceil(max(max(Z))),400), 'LineColor','none')
colorbar;
else
error('X, Y , Z must be columns')
end
end