【问题标题】:Hist3 Plotting and Axes RangeHist3 绘图和轴范围
【发布时间】:2013-07-17 17:40:55
【问题描述】:

我正在用 MATLAB 绘制一个 3-D 直方图,它工作得很好,除了不同的轴范围。我希望它们以某种方式定义,其中等值对位于二等分线上。

我的代码看起来像这样(或多或少从hist3 MATLAB 示例中“窃取”):

[vec_voxel_ids, vec_dose_values_reference, vec_dose_values_control] = ...
    textread('_BOOSTINT_voxel_data.txt', '%u %u %u');
mat_dose_values = [vec_dose_values_reference, vec_dose_values_control];
hist3(mat_dose_values, [100, 100]);
xlabel('Dose Reference');
ylabel('Dose Control');
set(gcf, 'renderer', 'opengl');
set(get(gca,'child'), 'FaceColor', 'interp', 'CDataMode', 'auto');

这是它的外观:

【问题讨论】:

  • 你能更准确地回答你的问题和你正在尝试什么吗?您是否尝试使用axis 调整轴限制? “等值对位于二等分线上”是什么意思?此外,您提供的代码默认提供 3-D 视图,我认为您错过了对 view(2) 的调用或类似的东西来获取您提供的图像。
  • 我有两个值从 0-1000 的向量,我将它们组合成一个 nx2 矩阵。如果同一索引处的两个值相同,则它们应位于二等分线上。在图像中,情况并非如此。我提供的这段代码是我获得上图的唯一方法。
  • 当然我改变了相机角度,只查看了 3d 直方图的 2D 投影,抱歉
  • 我仍然不知道你所说的“二等分线”是什么意思。这是通过原点的斜率为 1 的Y = X 线吗?问题是您的每个框(或 3-D 中的矩形棱镜)不是以它们对应的值为中心,而是位于左下角吗?
  • 此外,在这种情况下,如果您提供可运行的简单示例,人们会更容易提供帮助(并看到手头的问题)。我想你可以用一小部分“虚拟”数据和代码来更好地说明你的问题,这些数据和代码会创建低分辨率hist3

标签: matlab 3d plot histogram


【解决方案1】:

为了重新定位 bin 以使其中心对齐刻度并选择 bin 值的范围,您可以使用 hist3'edges' 选项(类似于 histc 中的选项):

data = 500+5*randn(1e3,2);           % dummy data
d = 1;                               % width for x and y bins
x = 480:d:520;                       % range for x bins
y = x;                               % use same range for y bins, can be different
hist3(data, 'edges', {x-d/2,y-d/2}); % subtract half bin width to center bins
set(gcf, 'renderer', 'opengl');
set(get(gca,'child'), 'FaceColor', 'interp', 'CDataMode', 'auto');
view(2)
axis equal
axis([478 522 478 522])
grid minor
xlabel('x')
ylabel('y')

这个例子产生了这样的结果:

请注意,这是对您的数据进行重新分箱,因此您的输出与以前相比可能略有不同。已移动 bin 以对齐其中心并重新计算直方图。

【讨论】:

  • 好的,这很有帮助。我添加了两条线“轴相等”和“轴([x1 y1 x2 y2])”,结果正如我所期望的那样。这本身是数据的重新分箱吗?据我了解,这只是重新定位垃圾箱。
  • 很高兴我想通了。至少对于您的示例代码,您是自动分箱的 - 只是要求 100×100 箱。在这种情况下,hist3 模仿 hist 在 bin 如何定位方面的行为,而不是histc 的行为。输入 edit hist3 并查看第 164 行附近的代码,如果您想了解详细信息。所以,是的,bin 边缘的位置会略有不同。
  • 顺便说一句,在我的代码中,命令hist3(data, 'edges', {x-d/2,y-d/2}); 可以替换为hist3(data, {x,y}); 以使用'Ctrs' 参数。然而,在 hist3 的底层使用 'edges' 参数并调用 hictc。如果您知道自己想要什么以及拥有什么,那么明确指定垃圾箱的边缘是有意义的。
  • 函数hist3 有一些严重的围栏问题:您会认为n 垃圾箱需要提供n+1 边。 hist3 不是这样,它会自动在高端创建另一个边缘(源代码中的第 202 行)...
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2011-12-04
相关资源
最近更新 更多