我一直试图在对数日志散点图上获得半透明圆形标记。 MATLAB自己的scatter
绘图函数不会生成半透明标记(请参阅下面的注释),因此我使用了来自Central File Exchange的这个精彩工具scatter_patches
,它可以正常工作非常好:
但是,我在修改此代码以解决对数日志散点图时遇到问题。为了使用该程序获得对数 - 对数散点图,我需要修复两件事:
1。将轴更改为对数刻度。这可以通过在第61行之后添加以下来实现:
set(cax, 'XScale', 'log');
set(cax, 'YScale', 'log');
这会产生正确的对数刻度和网格点。
2。然而,在我修正了1之后,我的情节中标记的大小并不均匀。在对数图上,轴的较低值区域被放大。在scatter_patches图中,轴下侧的标记较大,而朝向轴的较高值侧的标记较小。因此,整个图上的标记大小不一样。我尝试在第221-222行使用log10(cSize)
代替cSize
,但这只会减小最大和最小标记大小之间的差异。它没有在图上产生相同大小的标记。
如果有人知道我在这里可能缺少什么,请分享。
非常感谢任何帮助。
答案 0 :(得分:6)
因为 Matlab R2014b 事情变得非常简单。不需要文件交换的其他功能,只需要一些undocumented features。基本思想是获取标记的隐藏句柄并应用值< 1 表示EdgeColorData
中的最后一个值,以达到所需的透明度。
我们走了:
%// example data
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);
%// plot scatter, get handle
h = scatter(x,y);
drawnow; %// important
%// get marker handle
hMarkers = h.MarkerHandle;
%// get current edge and face color
edgeColor = hMarkers.EdgeColorData
faceColor = hMarkers.FaceColorData
%// set face color to the same as edge color
faceColor = edgeColor;
%// opacity
opa = 0.3;
%// set marker edge and face color
hMarkers.EdgeColorData = uint8( [edgeColor(1:3); 255*opa] );
hMarkers.FaceColorData = uint8( [faceColor(1:3); 255*opa] );
答案 1 :(得分:1)
如果它有所帮助,我编写了一系列Matlab函数,用于在图和图例中创建半透明标记。这些文件可从MATLAB Central获得,作为MarkerTransparency包。下载中包含了一些如何使用这些功能的示例,GitHub上还有一个Wiki。此软件包的一个主要优点是,用户可以在图例中显示半透明标记。这些功能尚未针对散点图进行测试,但可以轻松调整以满足您的需求。
答案 2 :(得分:0)
在第192行改变这一行:
hh(end+1) = patch( exp(cSize * sin(patchSpec) / ptsPerXUnit + xs(i)), exp(cSize * cos(patchSpec) / ptsPerYUnit + ys(i)), cColor, cPatchArgs{:});
它会起作用。
我只需添加exp()
确保在222和223行进行相同的操作!
像魅力Anindya一样工作;)。