对数 - 对数散点图上的半透明标记

时间:2016-04-07 11:10:47

标签: matlab plot matlab-figure scatter-plot markers

我一直试图在对数日志散点图上获得半透明圆形标记。 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,但这只会减小最大和最小标记大小之间的差异。它没有在图上产生相同大小的标记。

如果有人知道我在这里可能缺少什么,请分享。

非常感谢任何帮助。

3 个答案:

答案 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] ); 

enter image description here

答案 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一样工作;)。