如何在Matlab中将相关矩阵可视化为Schemaball

43

我在Matlab中有42个变量,并已经计算了它们的相关矩阵。现在我想用一个schemaball可视化它。有没有人有任何建议/经验,如何在Matlab中实现?以下图片将更好地解释我的观点:

SCHEMABALL

enter image description here

在这些图片中,每个变量之间的抛物线代表它们之间的相关强度。线条越粗,相关性越强。我更喜欢图1的样式,而不是图2中我使用不同的颜色来突出显示相关强度的样式。


你假设矩阵是对称的吗?负值怎么办? - Shai
1
你可能能够黑掉这个网址 http://www.mathworks.com/matlabcentral/fileexchange/19580-plot-a-directed-graph-v2-0 以获取你想要的。 - Shai
1
你可以在这里找到OP图片的来源(http://mkweb.bcgsc.ca/schemaball/?Perl_code)。我进行了一些反向工程,并得出结论,连接线是具有三个控制点的贝塞尔曲线:两个在圆的边界处,第三个在距离圆心可配置的距离处(默认为“0.1*R”)。如果@OlegKomarov没有回应,我将尝试在今天晚些时候自己查看它。 - Gunther Struyf
1
我会尝试使用抛物线,但目前很忙,可能明天才能发布一些东西。 - Oleg
显示剩余5条评论
5个回答

25

完成了,我想.. 代码可以在这里的github找到。 文件中包含文档。

黄色/洋红色(用于正/负相关性)以及标签字体大小和标签绘制的角度是可配置的,因此如果您愿意并且不均匀地沿周长/分组一些东西,您可以变得很奇特/…

如果您想要实际打印这些图表或在Matlab之外使用它们,建议使用矢量格式(例如eps)。当您缩放时,文字大小会更改,这也很烦人,但我不知道有什么办法可以在不攻击缩放功能的情况下解决这个问题 :/

schemaball % demo

在此输入图像描述

schemaball(arrayfun(@num2str,1:10,'uni',false), rand(10).^8,11,[0.1587 0.8750],[0.8333 1],2*pi*sin(linspace(0,pi/2-pi/20,10)))

这里输入图片描述

schemaball(arrayfun(@num2str,1:50,'uni',false), rand(50).^50,9)

在此输入图片描述


1
请将它们添加进去!你正在使用哪些工具箱? - Shai
1
支持负权重也太难了吗?比如黄色表示正相关,品红色表示负相关? - Shai
1
没有工具箱,只用老式的 MATLAB(plot 和 scatter)。当我继续这项工作时,我会为负相关性加一个开关(今天晚些时候)。 - Gunther Struyf
2
@horchler 我刚刚测试了LineSmoothing标志,但变化不大,说实话看不出什么区别。这就是为什么我建议使用矢量格式进行导出的原因。我使用这种方法的经验非常好:链接 - Gunther Struyf
1
@GuntherStruyf 真的做得很棒!你有没有考虑过3D版本? ;o) - anandr
显示剩余8条评论

25

我已经完成并提交了 我的版本FEX:schemaball,将尽快更新链接。

Gunther Struyf 的贡献相比,有一些不同之处:

  1. 您可以返回图形对象的句柄进行完全手动自定义
  2. 标签的方向使得最大化从左到右的可读性
  3. 图形会被拉伸以适应标签,但轴不会改变
  4. 语法仅需要相关系数矩阵(但允许可选输入)
  5. 为了性能而优化。

请参考 演示、自定义标签和创意定制的示例。 注意:第一个图是使用saveas()导出的,其他所有图都是用export_fig导出的。

schemaball

enter image description here enter image description here

x      = rand(10).^3;
x(:,3) = 1.3*mean(x,2);
schemaball(x, {'Hi','how','is','your','day?', 'Do','you','like','schemaballs?','NO!!'})

在这里输入图片描述

h = schemaball;
set(h.l(~isnan(h.l)), 'LineWidth',1.2)
set(h.s, 'MarkerEdgeColor','red','LineWidth',2,'SizeData',100)
set(h.t, 'EdgeColor','white','LineWidth',1)

输入图像描述

默认的色彩地图:

输入图像描述

为了改善屏幕渲染,您可以使用实验性的 -hgVersion 2 开关启动 MATLAB,这将默认生成反锯齿图形(来源:HG2 update | Undocumented Matlab)。但是,如果您尝试保存该图,文件将具有通常的旧反锯齿渲染效果,因此这里是 Gunther's schemaball 的屏幕截图图像:

输入图像描述


我正在编写一个函数,如果需要功能,请在此处发布请求。完成后,我将更新我的答案。另外,我无法在评论中发布图像。 - Oleg
+1 尝试HG2-它看起来变得非常好了。你在哪个版本的MATLAB中做到了这一点?看看在13b预发布版中它是什么样子可能会很有趣。 - Sam Roberts
@SamRoberts 我在R2013a中做了这件事,但不打算探索预发布版。另外,我已经制作了我的版本的schemaball,但我目前对它的设计感到不满意,因为它对于高维相关矩阵非常有效。例如,一个1e3 x 1e3的矩阵可能需要很长时间才能绘制,如果可以的话,颜色差异的视觉感知可以提供必要的性能改进。此外,节点的位置,虽然很小,但应该处理好,使标记不重叠。因此,我需要更多的时间来发布它。 - Oleg
1
非常好。撤回我的初始评论 +1! - Shai
不错,看来你又进了一步 :p - Gunther Struyf
显示剩余2条评论

5

太好了!谢谢你! - jjepsuomi

3
恰巧,MathWorks的首席数学家Cleve Moler在他最近的博客文章中展示了一个类似的绘图示例(不像你的例子那么美丽,连接线是直线而不是抛物线,但看起来很实用)。不幸的是,他没有直接包含代码,但如果你在文章下留言,他通常非常乐意分享东西。对你来说更好的可能是,他还应用了(这次包括)代码来交换数组的行/列,以最大化高度连接节点的空间接近度,而不是随机将它们排列在周围。你最终会得到一个“新月”形状的连接线信封,其中厚实的部分代表最高度连接的节点。不幸的是,我怀疑如果你需要增强他的代码以获得你例子中非常窄、高分辨率的线条,那么MATLAB目前的非反锯齿图形还不够。

1
@SamRoberts:代码可以在文章中提到的那个Xerox PARC FTP站点上找到。事实上,在我看到这个问题之前,我已经基于它发布了一个答案 :) - Amro

2

我最近一直在尝试使用MATLAB数据和D3可视化库制作类似的图形 - 有几种相关的环形可视化类型可能会引起您的兴趣,许多这些图形都是交互式的。另一个有用、成熟且免费的选择是Circos,它可能负责你在流行媒体中看到的大多数更漂亮的图形。


你怎样才能利用你在MATLAB中列出的软件包呢?举个例子会更好。 - Oleg
当然,我会尽量在明天或之后提供一些代码示例。但总的来说,使用D3只是将你的Matlab数据导出为与你选择的可视化方式相匹配的JSON格式的问题,可以使用类似JSONLab这样的工具。当然,这个可视化是在Matlab环境之外进行的。正如Sam在上面的回答中所说,很容易为稀疏共现矩阵格式化/创建JSON,并直接加载到像D3 viz这样的工具中。我还没有使用过Circos。 - MSommer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接