如何创建 3d 空间密度图?
how to create a 3d spatial density map?
我有一个随时间变化的粒子数系统(~100k 粒子)。事实上,每个粒子代表 3D space 中具有特定强度的相互作用。因此,每个粒子都有 (X,Y,Z;w),它是坐标加上一个介于 0 和 1 之间的权重因子,显示该坐标中相互作用的强度。
这里http://pho.to/9Ztti我上传了10张系统实时快照,粒子用微红的小点表示;点越红,相互作用越强。
问题是:如何生成这些粒子的 3D(空间)密度图,最好是在 Matlab 或 Origin Pro 9 或 ImageJ? Is there a way to, say, take the average of these images based on the red-color intensity in ImageJ 中?
因为我有粒子 (X,Y,Z;w) 的数值数据,所以我也可以在其他软件中分析这些数据。因此,欢迎您提出任何其他分析 approach/software
欢迎任何ideas/comments!
如果您的系统可以在 Matlab 中处理矩阵,它可能会像
一样简单
A = mean(M, 4);
假设 M
拥有您图像的 4D 编辑,那么 A
将是您的地图。
一种方法是使用 3D 散点图(气泡图),大小可变 circle/bubble,与粒子强度成正比。
这是一个模拟的例子:
N = 1e4; % number of particles
X = randn(N,1); % randomly generated coordinates
Y = 2*randn(N,1);
Z = 0.5*randn(N,1);
S = exp(-sqrt(X.^2 + Y.^2 + Z.^2)); % bubble size vector
scatter3(X,Y,Z,S*200)
结束
我在这里随机生成了 X、Y 和 Z 的值,而 S 与到云中心的距离成反比。
对于您的情况,如果我们假设 (X,Y,Z,w) 值存储在名为 Particles[=28 的二维数组中=],它将是:
X = Particles(:,1);
Y = Particles(:,2);
Z = Particles(:,3);
S = Particles(:,4);
希望对您有所帮助。
假设您的数据是连续的 3D space 并且您的数据集只是每个粒子相互作用的 3d 位置的列表,听起来您想要制作 4D 加权直方图。您必须将 3d space 分成 bin 并随时间对每个 bin 中的加权点求和,然后将结果绘制在单个 3d 图中,其中颜色表示随时间推移的加权交互总和。
这是一个随机生成的粒子相互作用的例子:`
%% Create dataSet of random particle interations in 3d space
for i=1:5000
if i == 1
dataSet = [rand()*100 rand()*100 rand()*100 rand() i];
else
dataSet(i,:) = [rand()*100 rand()*100 rand()*100 rand() i];
end
end
% dataSet = [x y z interactionStrength imageNumber]
xLimits = [min(dataSet(:,1)) max(dataSet(:,1))];
yLimits = [min(dataSet(:,2)) max(dataSet(:,2))];
zLimits = [min(dataSet(:,3)) max(dataSet(:,3))];
binSize = 10; % Number of bins to split each spatial dimention into
binXInterval = (xLimits(2)-xLimits(1))/binSize;
binYInterval = (yLimits(2)-yLimits(1))/binSize;
binZInterval = (zLimits(2)-zLimits(1))/binSize;
histo = [];
for i=xLimits(1)+(binSize/2):binXInterval:xLimits(2) + (binSize/2)
for j=yLimits(1)+(binSize/2):binYInterval:yLimits(2) + (binSize/2)
for k=zLimits(1)+(binSize/2):binZInterval:zLimits(2) + (binSize/2)
%% Filter out particle interactions found within the current spatial bin
idx = find((dataSet(:,1) > (i - binSize)) .* (dataSet(:,1) < i));
temp = dataSet(idx,:);
idx = find((temp(:,2) > (j - binSize)) .* (temp(:,2) < j));
temp = temp(idx,:);
idx = find((temp(:,3) > (k - binSize)) .* (temp(:,3) < k));
temp = temp(idx,:);
%% Add up all interaction strengths found within this bin
histo = [histo; i j k sum(temp(:,4))];
end
end
end
%% Remove bins with no particle interactions
idx = find(histo(:,4)>0);
histo = histo(idx,:);
numberOfImages = max(dataSet(:,5));
%% Plot result
PointSizeMultiplier = 100000;
scatter3(histo(:,1).*binXInterval + xLimits(1),histo(:,2).*binYInterval + yLimits(1),histo(:,3).*binZInterval + zLimits(1),(histo(:,4)/numberOfImages)*PointSizeMultiplier,(histo(:,4)/numberOfImages));
colormap hot;
%Size and color represent the average interaction intensity over time
4D 直方图由 10000 个随机生成的粒子相互作用制成。每个轴分为 10 个 bin。大小和颜色表示随时间推移每个容器中的粒子相互作用总和:
我有一个随时间变化的粒子数系统(~100k 粒子)。事实上,每个粒子代表 3D space 中具有特定强度的相互作用。因此,每个粒子都有 (X,Y,Z;w),它是坐标加上一个介于 0 和 1 之间的权重因子,显示该坐标中相互作用的强度。 这里http://pho.to/9Ztti我上传了10张系统实时快照,粒子用微红的小点表示;点越红,相互作用越强。
问题是:如何生成这些粒子的 3D(空间)密度图,最好是在 Matlab 或 Origin Pro 9 或 ImageJ? Is there a way to, say, take the average of these images based on the red-color intensity in ImageJ 中?
因为我有粒子 (X,Y,Z;w) 的数值数据,所以我也可以在其他软件中分析这些数据。因此,欢迎您提出任何其他分析 approach/software
欢迎任何ideas/comments!
如果您的系统可以在 Matlab 中处理矩阵,它可能会像
一样简单A = mean(M, 4);
假设 M
拥有您图像的 4D 编辑,那么 A
将是您的地图。
一种方法是使用 3D 散点图(气泡图),大小可变 circle/bubble,与粒子强度成正比。
这是一个模拟的例子:
N = 1e4; % number of particles
X = randn(N,1); % randomly generated coordinates
Y = 2*randn(N,1);
Z = 0.5*randn(N,1);
S = exp(-sqrt(X.^2 + Y.^2 + Z.^2)); % bubble size vector
scatter3(X,Y,Z,S*200)
我在这里随机生成了 X、Y 和 Z 的值,而 S 与到云中心的距离成反比。
对于您的情况,如果我们假设 (X,Y,Z,w) 值存储在名为 Particles[=28 的二维数组中=],它将是:
X = Particles(:,1);
Y = Particles(:,2);
Z = Particles(:,3);
S = Particles(:,4);
希望对您有所帮助。
假设您的数据是连续的 3D space 并且您的数据集只是每个粒子相互作用的 3d 位置的列表,听起来您想要制作 4D 加权直方图。您必须将 3d space 分成 bin 并随时间对每个 bin 中的加权点求和,然后将结果绘制在单个 3d 图中,其中颜色表示随时间推移的加权交互总和。
这是一个随机生成的粒子相互作用的例子:`
%% Create dataSet of random particle interations in 3d space
for i=1:5000
if i == 1
dataSet = [rand()*100 rand()*100 rand()*100 rand() i];
else
dataSet(i,:) = [rand()*100 rand()*100 rand()*100 rand() i];
end
end
% dataSet = [x y z interactionStrength imageNumber]
xLimits = [min(dataSet(:,1)) max(dataSet(:,1))];
yLimits = [min(dataSet(:,2)) max(dataSet(:,2))];
zLimits = [min(dataSet(:,3)) max(dataSet(:,3))];
binSize = 10; % Number of bins to split each spatial dimention into
binXInterval = (xLimits(2)-xLimits(1))/binSize;
binYInterval = (yLimits(2)-yLimits(1))/binSize;
binZInterval = (zLimits(2)-zLimits(1))/binSize;
histo = [];
for i=xLimits(1)+(binSize/2):binXInterval:xLimits(2) + (binSize/2)
for j=yLimits(1)+(binSize/2):binYInterval:yLimits(2) + (binSize/2)
for k=zLimits(1)+(binSize/2):binZInterval:zLimits(2) + (binSize/2)
%% Filter out particle interactions found within the current spatial bin
idx = find((dataSet(:,1) > (i - binSize)) .* (dataSet(:,1) < i));
temp = dataSet(idx,:);
idx = find((temp(:,2) > (j - binSize)) .* (temp(:,2) < j));
temp = temp(idx,:);
idx = find((temp(:,3) > (k - binSize)) .* (temp(:,3) < k));
temp = temp(idx,:);
%% Add up all interaction strengths found within this bin
histo = [histo; i j k sum(temp(:,4))];
end
end
end
%% Remove bins with no particle interactions
idx = find(histo(:,4)>0);
histo = histo(idx,:);
numberOfImages = max(dataSet(:,5));
%% Plot result
PointSizeMultiplier = 100000;
scatter3(histo(:,1).*binXInterval + xLimits(1),histo(:,2).*binYInterval + yLimits(1),histo(:,3).*binZInterval + zLimits(1),(histo(:,4)/numberOfImages)*PointSizeMultiplier,(histo(:,4)/numberOfImages));
colormap hot;
%Size and color represent the average interaction intensity over time
4D 直方图由 10000 个随机生成的粒子相互作用制成。每个轴分为 10 个 bin。大小和颜色表示随时间推移每个容器中的粒子相互作用总和: