使用散点图可视化大型3D数据集 [英] Visualizing large 3D dataset with scatter plot

查看:254
本文介绍了使用散点图可视化大型3D数据集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在MATLAB中进行仿真,其中有一个很大的3D数据集,每个时间步长都会改变.我正在尝试使用3D散点图来可视化数据,随着模拟的进行,这些点在不同的位置,大小,颜色和透明度级别上都处于不同的位置.尺寸和颜色信息是多余的.

I'm running a simulation in MATLAB in which I have a large 3D dataset that changes each time step. I'm trying to visualize the data using a 3D scatter plot with points that take on different locations, sizes, colors, and transparency levels as the simulation proceeds. The size and color information are redundant.

在MATLAB中渲染和旋转图形既缓慢又不稳定.我的计算机具有4 GHz i7-4790 CPU和NVIDIA GeForce GTX 750 Ti图形卡.我在Windows 7上使用Matlab R2016a.我检查了MATLAB OpenGL设置,并且硬件支持级别已满. (硬件OpenGL对于透明性是必需的.)此外,我正在使用 GPU-Z ,并且在绘图和旋转过程中,GPU的负载峰值仅为25%至30%.

Rendering and rotating the figure in MATLAB is slow and choppy. My computer has a 4 GHz i7-4790 CPU and a NVIDIA GeForce GTX 750 Ti graphics card. I am using Matlab R2016a on Windows 7. I checked my MATLAB OpenGL settings and the hardware support level is full. (Hardware OpenGL is necessary for transparency.) Moreover, I'm monitoring my GPU usage using GPU-Z, and during plotting and rotation, the GPU load peaks at only 25-30%.

这是我的代码示例:

load sample_data2
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);

figure(1);
for i = 1:num_channels
    g = plot3(channels{i}(:, 1), channels{i}(:, 2), channels{i}(:, 3), 'k');
    set(g, 'LineWidth', 1.5)
    hold on;
    text(channels{i}(1, 1), channels{i}(1, 2), channels{i}(1, 3), num2str(i))
end
caxis([0 1])
colorbar
drawnow

numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;
for t = 1:T
    plot_signal = nan(size(grid_x));
    plot_signal(sort(randsample(numel(grid_x), numplotpts))) =...
        sort(rand(numplotpts, 1));
    tic
    for i = 1:numDivisions
        temp = plot_signal(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        yplot = grid_y(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        xplot = grid_x(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        zplot = grid_z(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
        if t == 1
            h(i) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
                zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
                'filled', 'MarkerFaceAlpha', exp(-i)^0.25);
        else
            h(i).XData = yplot(~isnan(temp));
            h(i).YData = xplot(~isnan(temp));
            h(i).ZData = zplot(~isnan(temp));
            h(i).SizeData = 50*temp(~isnan(temp));
            h(i).CData = temp(~isnan(temp));
        end
    end
    drawnow
    toc
end

,这是数据的链接.有什么方法可以加快渲染速度并使旋转更平滑吗?我注意到将所有数据点的大小固定为单个标量可以极大地加快渲染和旋转速度.是否可以保持代码中的大小不变,并且仍然可以使图形呈现并快速旋转?

and here is a link to the data. Is there any way to speed up the rendering and make rotation smoother? I noticed that fixing the size of all data points to a single scalar greatly speeds up rendering and rotation. Is it possible to keep the size as it is in the code and still have the figure render and rotate quickly?

编辑:一个相关问题我发布了.

推荐答案

听起来timer函数是下一步尝试的好地方,以便了解模拟的进度,然后在创建AVI时就可以了对事物的外观感到满意.

It sounds like the timer function is a good place to try next in order to get a sense of your simulation's progression and then making an AVI once you are satisfied with how things look.

MATLAB有一些很棒的文档,其中包含进行连续呼叫的各种选项及其之间的间隔.检出ExecutionModePeriod属性.

MATLAB's got some great documentation for it with a variety of options for consecutive calls are made and the spacing between them. Check out the ExecutionMode and Period properties.

这篇关于使用散点图可视化大型3D数据集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆