Matlab快速绘制类似R语言中的散点密度图

11 篇文章 4 订阅
7 篇文章 1 订阅

此前已经发布过博客 Matlab绘制散点密度图,其主要思路是计算每个点周围一定范围内的点个数。对于数据量较小时,该博客 Matlab绘制散点密度图 中的内容都能比较好的解决小数据量的问题,用时也在可接受的范围内;但当数据量很大时,比如有十几万个点,此时的运行效率则十分低下。

这里通过将数据进行重采样,进而绘制类似于R语言的散点密度图(输入的样本数量为 459780 个),重采样后的数据量降到 4731

在这里插入图片描述

绘制的结果如下:

在这里插入图片描述

%%
% X 用户输入X
% Y 用户输入Y

%%
% key parameters
% 输入数据后,由于数据量很大,因此按照一定的步长进行重采样
% 目前还没办法自适应设置步长,需要用户多次尝试
step = 5; 
% 绘制散点图时,点的大小
% 目前还没办法让程序根据生成图像的大小自动调节点的大小,需要用户多次尝试
ptsize = 15; 

X = floor(X / step + step / 2) * step + step / 2;
Y = floor(Y / step + step / 2) * step + step / 2;

%%
XY = unique([X, Y], 'rows');
Z = zeros(size(XY, 1), 1); % 点密度的颜色即根据Z值进行绘制

for i = 1 : length(Z)
    disp([i, length(Z)]);
    idx = find(X == XY(i, 1) & Y == XY(i, 2));
    Z(i) = length(idx);
end

%%
% 绘图
figure(1);

gc = get(gca);
set(gcf, 'position', [50, 50, 720, 600]);
backColor = [0.9 0.9 0.9];
set(gca, 'color', backColor);

set(gca, 'FontName', 'Arial', 'FontSize', 15);
xlabel('Observation', 'FontSize', 15, 'FontName', 'Arial');
ylabel('Simulation', 'FontSize', 15, 'FontName', 'Arial');
hold on;

% 如果点特别集中于某一部分而看不到差异,可以将Z改成log(Z)
% 如果分布比较均匀,则直接使用Z
s = scatter(XY(:, 1), XY(:, 2), ptsize, log(Z), 'filled', 's'); 
colorbar;
colormap(jet);
% set(colorbar, 'YTick', 50 : 50 : 150);

hold on;
plot([-10 ^ 8 10 ^ 8], [-10 ^ 8 10 ^ 8], 'k-', 'LineWidth', 1.25);

maxXY = max(XY(:));
minXY = min(XY(:));
xlim([minXY - 2 * step, maxXY + 2 * step]);
ylim([minXY - 2 * step, maxXY + 2 * step]);

rr = axis;
plot(rr(1:2), [rr(4), rr(4)], 'k-', [rr(2), rr(2)], rr(3:4), 'k-');
hold on;

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A-Chin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值