MATLAB 使用ksdensity实现3D堆叠1D条件分布绘图的问题求解
解决方案
步骤1:预处理数据并生成统一的收益率采样网格
首先提取全量收益率的取值范围,生成统一的x轴采样点,保证所有分组的密度计算都基于相同的x坐标,从根源解决不同分组x长度不一致的问题。
% 假设你的原始矩阵为data,第一列是指标ind,第二列是收益率ret ind = data(:,1); ret = data(:,2); % 生成统一的x采样网格,点数可按需调整,这里设为200个点 x_grid = linspace(min(ret), max(ret), 200); % 初始化存储结果的矩阵,9行对应9个指标值,200列对应x_grid的密度值 dens_mat = zeros(9, length(x_grid));
步骤2:分组计算核密度并对齐到统一网格
循环遍历1-9的指标值,提取对应分组的收益率数据,调用ksdensity时指定输出的采样点为刚才生成的x_grid,这样所有分组的密度结果长度完全一致。
for i = 1:9 % 提取当前指标对应的收益率样本 group_ret = ret(ind == i); % 计算核密度,直接输出到统一的x_grid上 dens_mat(i,:) = ksdensity(group_ret, x_grid); end
步骤3:绘制3D密度曲线
用meshgrid生成x和y的坐标矩阵,直接调用plot3逐行绘制9条密度曲线即可,也可以用mesh/surf绘制曲面效果。
figure [X, Y] = meshgrid(x_grid, 1:9); % 逐组绘制3D曲线 for i = 1:9 plot3(X(i,:), Y(i,:), dens_mat(i,:), 'LineWidth', 1.5) hold on end % 坐标轴标注 xlabel('收益率') ylabel('指标取值') zlabel('条件密度') grid on view(30, 30) % 调整视角到合适位置
可选优化
如果希望得到更平滑的曲面效果,可以直接调用surf(X, Y, dens_mat, 'EdgeColor', 'none')替代逐行plot3,效果更接近堆叠的密度曲面。
内容的提问来源于stack exchange,提问作者ChrisP.
相关产品推荐
相关产品推荐

