MATLAB中scatterhist标记点透明度控制及叠加等高线方法咨询
解决MATLAB scatterhist的两个需求:散点透明度与等高线叠加
我来帮你搞定这两个关于scatterhist的可视化需求,一步步来~
一、控制散点标记的透明度
scatterhist函数返回的对象里包含了散点图的句柄,咱们可以直接通过修改这个句柄的透明度属性来实现效果:
首先调用
scatterhist时,要捕获返回的所有句柄:[ax, hscat, hbx, hby] = scatterhist(x, y);这里
hscat就是散点图的句柄,ax是三个子图的轴对象数组,hbx和hby是左右两个直方图的句柄。修改散点的透明度属性:
MATLAB里散点的透明度分填充色透明度(MarkerFaceAlpha)和边框色透明度(MarkerEdgeAlpha),你可以根据需求单独设置:% 设置填充透明度为0.3(0完全透明,1完全不透明),边框透明度为0.6 set(hscat, 'MarkerFaceAlpha', 0.3, 'MarkerEdgeAlpha', 0.6);如果想要填充和边框透明度一致,只需要设置其中一个或者两个都设为相同值就行。
二、在散点上方添加等高线图
要在散点上叠加等高线,咱们需要先计算数据的核密度分布,再把等高线绘制在散点图的轴上:
完整示例代码
% 生成示例数据(你可以替换成自己的数据) rng(1); % 固定随机种子,结果可复现 x = randn(1000, 1); y = x + randn(1000, 1)*0.5; % 1. 创建scatterhist并设置散点透明度 [ax, hscat, hbx, hby] = scatterhist(x, y, 'Marker', 'o'); set(hscat, 'MarkerFaceAlpha', 0.3, 'MarkerEdgeAlpha', 0.6); % 2. 计算数据的核密度分布 % 生成网格点,用来绘制等高线 [X, Y] = meshgrid(linspace(min(x), max(x), 100), linspace(min(y), max(y), 100)); % 用ksdensity计算联合概率密度 [f, ~, ~] = ksdensity([x y], [X(:) Y(:)]); % 将密度值重塑为网格形状 F = reshape(f, size(X)); % 3. 在散点图轴上绘制等高线 % 绘制5条等高线,设置线宽和颜色 contour(ax(1), X, Y, F, 5, 'LineWidth', 1.2, 'Color', 'k'); % 调整层级,让等高线显示在散点上方 set(hscat, 'ZOrder', 'back');
关键步骤解释
- 核密度计算:用
ksdensity函数计算二维数据的联合密度,这样得到的等高线能反映数据的分布集中程度。 - 轴对象指定:必须指定在
ax(1)(中间的散点图轴)上绘制等高线,不然会默认在新的轴里绘制。 - 层级调整:通过
ZOrder属性把散点设为“back”,等高线就会自动显示在散点上方啦。
内容的提问来源于stack exchange,提问作者Oliver Amundsen
相关产品推荐
相关产品推荐

