如何创建三维联合密度图MATLAB?

时间:2012-04-12 15:50:00

标签: matlab plot probability histogram

我在从数据创建关节密度函数时遇到问题。我所拥有的是来自股票的队列大小,因为两个向量保存为:

X = [askQueueSize bidQueueSize];

然后我使用hist3函数创建3D直方图。这就是我得到的: http://dl.dropbox.com/u/709705/hist-plot.png

我想要的是让Z轴归一化,使其从[0 1]开始。

我该怎么做?或者有人在库存中有一个很好的联合密度matlab 功能?

这类似(How to draw probability density function in MatLab?)但在2D中。

我想要的是带有x:ask queue, y:bid queue, z:probability的3D。

如果有人可以帮助我,我将非常感激,因为我在这里碰到了一堵墙。

3 个答案:

答案 0 :(得分:3)

我看不到这样做的简单方法。您可以使用

从hist3获取直方图计数
[N C] = hist3(X);

并且想法是通过以下方式将它们标准化:

N = N / sum(N(:));

但我找不到一种很好的方法将它们绘制回直方图(你可以使用bar3(N),但我认为需要手动设置轴标签。

我最终解决的问题涉及修改hist3的代码。如果你有权访问这个(edit hist3)那么这可能对你有用,但我不确定法律情况是什么(你需要统计工具箱的许可证,如果你复制hist3并自己修改它,这可能不合法)。

无论如何,我找到了为surf情节准备数据的地方。有3个矩阵对应于x,y和z。就在计算z矩阵的内容之前(第256行),我插入了:

n = n / sum(n(:));

将计数矩阵标准化。

最后绘制直方图后,您可以设置轴限制:

xlim([0, 1]);

如有必要。

答案 1 :(得分:2)

在mathworks论坛上的一个人的帮助下,这是我最终得到的最佳解决方案:

(data_x和data_y是您想要在hist3计算的值)

x = min_x:step:max_x; % axis x, which you want to see
y = min_y:step:max_y; % axis y, which you want to see

[X,Y] = meshgrid(x,y); *%important for "surf" - makes defined grid*

pdf = hist3([data_x , data_y],{x y}); %standard hist3 (calculated for yours axis)
pdf_normalize = (pdf'./length(data_x)); %normalization means devide it by length of 
                                         %data_x (or data_y)
figure()
surf(X,Y,pdf_normalize) % plot distribution

这给了我3D的联合密度图。可以通过计算表面上的积分来检查:

integralOverDensityPlot = sum(trapz(pdf_normalize));

当变量 step 变为零时,变量 integralOverDensityPlot 变为1.0

希望这能有所帮助!

答案 2 :(得分:0)

如何使用hist3函数快速完成此操作:

[bins centers] = hist3(X); % X should be matrix with two columns
c_1 = centers{1};
c_2 = centers{2};
pdf = bins / (sum(sum(bins))*(c_1(2)-c_1(1)) * (c_2(2)-c_2(1)));

如果你“整合”这个,你将获得1.

sum(sum(pdf * (c_1(2)-c_1(1)) * (c_2(2)-c_2(1))))