3D直方图和条件着色

3
我有一系列有序的点(X,Y,Z),我想绘制一个三维直方图,请问有什么建议吗?
我正在尝试按照这篇教程http://www.mathworks.com/help/stats/hist3.html进行操作,但这里的点是随机的并且以函数的形式呈现。我的例子更简单,因为我已经知道这些点。
此外,根据Z坐标的数值大小,我希望能以不同的颜色进行着色。例如,最大值-绿色,最小值-红色。与此类似的情况可以参考这个链接在MATLAB中对直方图图表进行条件着色,只是这里是三维。
因此,如果我有一系列点:
X = [32 64 32 12 56 76 65]
Y = [160 80 70 48 90 80 70]
Z = [80 70 90 20 45 60 12]

您能帮我处理一下3D直方图与条件着色的代码吗?

目前代码如下:

X = [32 64 32 12 56 76 65];
Y= [160 80 70 48 90 80 70];
Z= [80 70 90 20 45 60 12];
A = full( sparse(X',Y',Z'));
figure; 
h = bar3(A); % get handle to graphics
for k=1:numel(h), 
    z=get(h(k),'ZData'); % old data - need for its NaN pattern
    nn = isnan(z); 
    nz = kron( A(:,k),ones(6,4) ); % map color to height 6 faces per data point 
    nz(nn) = NaN; % used saved NaN pattern for transparent faces 
    set(h(k),'CData', nz); % set the new colors
end
colorbar;

现在我只需要清除线条并设计图表,使其看起来有用。但是如何制作一根bar3,而不需要整个网格都在0级上?


这个链接是否不包含你的应用程序:https://dev59.com/KmAf5IYBdhLWcg3w31-O?特别是这个答案:https://dev59.com/KmAf5IYBdhLWcg3w31-O#24550095。 - Dan
非常接近了,@Dan,之前没有找到这个,谢谢!我主要的问题是这里给出的点都在Z轴上 - 一排。我想要X-Y点,带有Z高度。这就是我在这里难以实现的东西... - energyMax
所以尝试使用第二个链接中的代码,并像这样创建它们的 ZZ = full(spares(X',Y',Z')),然后您只需要想办法清除边缘线即可。 - Dan
@Dan 你有任何关于如何“清除”图表的建议吗?目前,矩阵(?)覆盖在图表上。 - energyMax
加什么? :) 请继续... - energyMax
显示剩余2条评论
1个回答

2
根据这个答案,你只需要重新排列你的数据以匹配该答案的Z格式。然后,您可能需要删除边线并可能清除零高度的条形图。
% Step 1: rearrange your data
X = [32 64 32 12 56 76 65];
Y= [160 80 70 48 90 80 70];
Z= [80 70 90 20 45 60 12];
A = full( sparse(X',Y',Z'));

% Step 2: Use the code from the link to plot the 3D histogram
figure; 
h = bar3(A); % get handle to graphics

set(h,'edgecolor','none'); % Hopefully this will remove the lines (from https://www.mathworks.com/matlabcentral/newsreader/view_thread/281581)

for k=1:numel(h), 
    z=get(h(k),'ZData'); % old data - need for its NaN pattern
    nn = isnan(z); 
    nz = kron( A(:,k),ones(6,4) ); % map color to height 6 faces per data point 
    nz(nn) = NaN; % used saved NaN pattern for transparent faces 

    nz(nz==0) = NaN; % This bit makes all the zero height bars have no colour

    set(h(k),'CData', nz); % set the new colors. Note in later versions you can do h(k).CData = nz
end

colorbar;

enter image description here


谢谢@Dan。很抱歉打扰您,但您是否知道为什么我会得到这样的结果,就像这张图片上显示的一样[链接](http://shrani.si/f/3t/QW/44alnEU2/napaka.png)我指的是图表中的所有数字。 - energyMax
奇怪,你用的是哪个版本的MATLAB?那是直接复制粘贴我的代码吗?输入参数都一样吗? - Dan
是的,我只添加了“axis equal”额外的代码。版本是R2001b 7.13.0.564 - 我应该获取一个更新的版本。 - energyMax
我的意思是哪一年?是R2011吗?没有使用“axis equal”,它能工作吗? - Dan
在旧版本中,我会建议尝试一下来自该链接的其他答案形式,例如Amro's。它们是为Octave构建的,因此我认为它们也可以在旧版本的MATLAB上运行。很抱歉,我不知道您的图像发生了什么。 - Dan
1
丹,我已经安装了2014版本,它完美地运行!再次感谢,看起来很棒! - energyMax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接