【问题标题】:Semi-transparent markers on log-log scatter plot对数散点图上的半透明标记
【发布时间】:2016-07-28 05:34:42
【问题描述】:

我一直试图在 log-log 散点图上获得 半透明圆形标记。 MATLAB 自己的 scatter 绘图函数不会产生半透明标记(参见下面的 cmets),所以我使用来自 Central File Exchange 的这个奇妙的工具 scatter_patches 并且效果很好:

但是,我在将此代码调整为对数对数散点图时遇到问题。为了使用该程序获得对数散点图,我需要修复两件事:

1 .将轴更改为对数刻度。这可以通过在第 61 行之后添加以下内容来实现:

set(cax, 'XScale', 'log'); 
set(cax, 'YScale', 'log'); 

这会产生正确的对数刻度和网格点。

2 。但是,在我修复 1. 之后,标记的大小在我的图中并不统一。在对数图上,轴的较低值区域被放大。在 scatter_patches 图中,坐标轴下侧的标记较大,而坐标轴较高值侧的标记较小。因此,整个图上的标记大小并不相同。我尝试在第 221-222 行使用 log10(cSize) 而不是 cSize,但这只会缩小最大和最小标记大小之间的差异。它没有在绘图上产生相同大小的标记。

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

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过将 Matlab 的散点图与set(hadle_to_scatterplot,'MarkerFaceColor','None') 一起使用?似乎scatter_patches 创建了一个圆圈而不是标记。
  • 我试过了。将“MarkerFaceColor”设置为“无”相当于将透明度设置为 100%。但是,我想控制透明度。如果存在像“MarkerFaceAlphaValue”这样的属性,那么我可以将透明度设置为任意值。但是这样的属性是不存在的。 scatter_patches 使用补丁代替标记;所以可以设置一个 FaceAlphaValue。该程序还允许创建其他形状,而不仅仅是圆形。该程序在线性图上运行良好。这是需要进行一些更改的日志图。
  • 我认为这个article 会让你感兴趣。你有没有尝试添加一个exp()here:set(patchObjects(i), 'XData', cSize * sin(patchSpec) / ptsPerXUnit + xs(i)); set(patchObjects(i), 'YData', cSize * cos(patchSpec) / ptsPerYUnit + ys(i));like set(patchObjects(i), 'XData', cSize * exp(sin(patchSpec))/ ptsPerXUnit + xs(i)); 但我没试过!
  • Ups:更像这样:set(patchObjects(i), 'XData', exp(cSize * sin(patchSpec)/ ptsPerXUnit + xs(i))); 和 YData 一样

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


【解决方案1】:

自从 Matlab R2014b 开始,事情变得非常简单。不需要文件交换的其他功能,只需要一些undocumented features。基本思想是获取标记的隐藏句柄并为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] ); 

【讨论】:

  • 我试过这个。但这似乎只影响边缘的透明度,而不影响标记的面。
  • 可以肯定的是,您的方法将hMarkers.EdgeColorData 维度从1x1x3 更改为1x1x4,其中“层”分别代表红色、绿色、蓝色和不透明度通道?换句话说,可以假设uint8 数组大小为M x N x 4 表示宽度为M 像素、高度为N 像素的纹理贴图,每个像素定义了颜色和poacity?
  • @user164568 我有 MATLAB 2011b,所以我不能尝试。您是否尝试过改用hMarkers.FaceColorData
  • @Crowley 是的,没错。
  • @user164568 当然不是,因为你需要 FaceColorData 属性。看看我的编辑。
【解决方案2】:

如果有帮助,我编写了一组 Matlab 函数,用于在绘图和图例中创建半透明标记。这些文件可从 MATLAB Central 以 MarkerTransparency 包的形式获得。下载中包含如何使用这些功能的一些示例,GitHub 上还有一个 Wiki。这个包的一个主要好处是它使用户能够让半透明标记也出现在图例中。这些函数尚未针对散点图进行测试,但可能很容易适应您的需求。

【讨论】:

    【解决方案3】:

    在第 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 一样工作;)。

    【讨论】:

    • 我的情节是 log10 规模。所以我使用了hh(end+1) = patch( 10.^((cSize * sin(patchSpec) / ptsPerXUnit + xs(i))./10), 10.^((cSize * cos(patchSpec) / ptsPerYUnit + ys(i))./10), cColor, cPatchArgs{:}); 这肯定会产生相同大小的圆圈。但是,我的绘图看起来与 MATLAB 的 scatterplot 函数生成的绘图不同。见这里:imgur.com/21yM6hY
    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 2021-01-31
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多