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

Semi-transparent markers on log-log scatter plot

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

如果有人知道我在这里可能遗漏了什么,请分享。

如有任何帮助,我们将不胜感激。

在第 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 ;)。

自从 Matlab R2014b 以来,事情变得非常简单。不需要文件交换的额外功能,只需要一些 undocumented features。基本思想是获取标记的隐藏句柄并对 EdgeColorData 中的最后一个值应用值 < 1 以实现所需的透明度。

开始吧:

%// 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] ); 

如果有帮助,我编写了一组 Matlab 函数,用于在绘图和图例中创建半透明标记。这些文件可以作为 MarkerTransparency package. A few examples of how to use these functions are included in the download and there is also a Wiki on GitHub 从 MATLAB Central 获得。这个包的一个主要好处是它使用户能够让半透明标记也出现在图例中。这些函数尚未针对散点图进行测试,但可以轻松调整以满足您的需求。