gpt4 book ai didi

Matlab - 创建热图以可视化二维点数据的密度

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:39 25 4
gpt4 key购买 nike

给定一个 N x N 数组,我想生成一个以这种方式可视化数据的热图:

enter image description here

鉴于下面的源图像,我创建了一个稀疏填充的 N X N 数组,其中包含下面列出的点。 1000x800 阵列中的 90 个点。

enter image description here

在网上研究如何生成这样的热图时,我偶然发现使用颜色图只是为了得到令人失望的结果。

colormap('hot');   % set colormap
imagesc(points); % draw image and scale colormap to values range
colorbar;

我得到了相当令人失望的结果。

enter image description here

我还有什么其他选择可以使我的上面的图像与上面的图像相似?

最佳答案

有几种不同的方法可以将分散或稀疏矩阵数据转换为热图,从而提供更好的点密度可视化效果。我将在此处展示的示例将从分散的数据开始,因此如果您已经拥有二维矩阵/直方图中的数据,则可以跳过初始步骤...

直方图:

如果您的分散数据相当密集,您可能只需要一个简单的二维直方图。您可以创建一个覆盖分散点的网格(以您选择的分辨率)并使用 histcounts2 在 x 和 y 方向上对数据进行分箱。 :

% Normally distributed sample points:
x = randn(1, 10000);
y = randn(1, 10000);

% Bin the data:
pts = linspace(-4, 4, 101);
N = histcounts2(y(:), x(:), pts, pts);

% Plot scattered data (for comparison):
subplot(1, 2, 1);
scatter(x, y, 'r.');
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]));

% Plot heatmap:
subplot(1, 2, 2);
imagesc(pts, pts, N);
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]), 'YDir', 'normal');

这是结果图:

enter image description here

直方图+过滤:

如果您的分散数据相当稀疏,您仍然可以像上面那样创建一个直方图,然后过滤结果以使其平滑。你可以使用 imdilate如果你有 Image Processing Toolbox ,或创建一个过滤矩阵并使用 conv2 .这是后者的一个例子:

% Normally distributed sample points:
x = randn(1, 100);
y = randn(1, 100);

% Bin the data:
pts = linspace(-3, 3, 101);
N = histcounts2(y(:), x(:), pts, pts);

% Create Gaussian filter matrix:
[xG, yG] = meshgrid(-5:5);
sigma = 2.5;
g = exp(-xG.^2./(2.*sigma.^2)-yG.^2./(2.*sigma.^2));
g = g./sum(g(:));

% Plot scattered data (for comparison):
subplot(1, 2, 1);
scatter(x, y, 'r.');
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]));

% Plot heatmap:
subplot(1, 2, 2);
imagesc(pts, pts, conv2(N, g, 'same'));
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]), 'YDir', 'normal');

这是结果图:

enter image description here

距离变换:

从上面的稀疏直方图开始,您可以使用 bwdist来自 Image Processing Toolbox创建数据的距离变换。这将根据每个像素与最近的非零像素的距离为每个像素分配一个值。

或者,您可以避免通过 creating a grid 计算二维直方图覆盖您的散点并使用 pdist2 计算每个网格点到您的一个散点的最小距离来自 Statistics Toolbox .这是一个示例(使用与上述相同的示例数据):

% Generate grid and compute minimum distance:
pts = linspace(-3, 3, 101);
[X, Y] = meshgrid(pts);
D = pdist2([x(:) y(:)], [X(:) Y(:)], 'euclidean', 'Smallest', 1);

% Plot scattered data:
subplot(1, 2, 1);
scatter(x, y, 'r.');
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]));

% Plot heatmap:
subplot(1, 2, 2);
imagesc(pts, pts, reshape(D, size(X)));
axis equal;
set(gca, 'XLim', pts([1 end]), 'YLim', pts([1 end]), 'YDir', 'normal');
colormap(flip(parula(), 1));

这是结果图:

enter image description here

关于Matlab - 创建热图以可视化二维点数据的密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46996206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com