【问题标题】:How to visualize correlation matrix as a schemaball in Matlab如何在 Matlab 中将相关矩阵可视化为模式球
【发布时间】:2013-06-06 23:08:51
【问题描述】:

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

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

【问题讨论】:

  • 你假设矩阵是对称的?负值呢?
  • 你也许可以破解这个mathworks.com/matlabcentral/fileexchange/… 以获得你想要的东西
  • 你可以找到OP的图片来源here。我对其进行了一些逆向工程,并得出结论,连接线是具有三个控制点的贝塞尔曲线:两个在圆的边界,第三个在距圆中心的可配置距离处(默认0.1*R)。如果@OlegKomarov 没有通过,我会在今天晚些时候自己尝试查看
  • 我会尝试抛物线,但目前很忙,明天可能会发布一些东西。

标签: matlab plot visualization correlation graph-visualization


【解决方案1】:

巧合的是,Cleve Moler(MathWorks 首席数学家)在他最近的blog post 中展示了这种情节的一个例子(不像你的例子那么漂亮,连接线是直线而不是抛物线,但它看起来很实用)。不幸的是,他没有直接包含代码,但如果你在帖子上给他留下评论,他通常非常愿意分享。

对您来说更好的是,他还应用(这次包括)代码来置换数组的行/列,以最大限度地提高高度连接节点的空间接近度,而不是在圆周。你最终会得到一个“新月”形的连接线包络,新月形的粗一点代表连接度最高的节点。

然而,不幸的是,我怀疑如果您需要增强他的代码以在示例图中获得非常窄的高分辨率线条,那么 MATLAB 目前的非抗锯齿图形还不能完全满足。

【讨论】:

  • @SamRoberts:该代码可在文章中提到的 Xerox PARC ftp 站点上找到。事实上,在我看到这个问题之前,我只是基于它发布了一个answer :)
【解决方案2】:

我猜有点完成了.. 代码可以在here at 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)

【讨论】:

  • 添加它们!你用的是什么工具箱?
  • 要求支持负权重是不是太过分了?即,黄色的正相关和洋红色的负相关?
  • 没有工具箱,只是普通的旧 matlab(绘图和散点图)。当我继续工作时(今天晚些时候),我会为负相关设置一个开关..
  • @horchler 我刚刚测试了LineSmoothing 标志,但它并没有太大变化,老实说看不出有什么不同。这就是为什么我建议在导出时使用矢量格式。我使用这些方法的经验非常好:link
  • @GuntherStruyf 干得好!你有想过3D版本吗? ;o)
【解决方案3】:

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

Gunther Struyf的贡献有些不同:

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

按照演示、自定义标签和创意自定义的示例。 注意:第一个图是用saveas()导出的,其他的都是export_fig

schemaball

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 的 schemaball 的打印屏幕图像:

【讨论】:

  • 我也在写一个函数,功能请求可以在这里发布。完成后,我将更新我的答案。另外,我无法在评论中发布图片。
  • +1 用于尝试 HG2 - 它开始看起来真的不错。您在哪个版本的 MATLAB 中执行此操作?看看它在 13b 预发行版中的样子可能会很有趣。
  • @SamRoberts 我在 R2013a 中做过,但不打算探索预发布。另一方面,我制作了我的模式球版本,但我目前对它的设计不满意,因为它工作得很好,但适用于高维相关矩阵。例如,一个 1e3 x 1e3 矩阵可能需要相当长的时间来绘制,如果有的话,颜色差异的视觉感知可以提供必要的性能改进。此外,节点的定位虽然很小,但应进行处理,以使标记不重叠。因此,我还需要一些时间来发布它。
  • 非常好。收回我最初的 cmets +1!
  • 很好,你显然更进一步:p
【解决方案4】:

我最近一直在尝试使用 MATLAB 数据和 D3 visualization library 来获取类似的图表 - 您可能对几种相关类型的循环可视化感兴趣,其中许多是交互式的。另一个有用、完善且免费提供的选项是Circos,它可能是您在大众媒体上看到的这些图表的大多数更漂亮版本的原因。

【讨论】:

  • 您如何利用您在 MATLAB 中列出的软件包?一个例子会很棒。
  • 当然,我会尝试在第二天左右提供一些代码示例,但通常使用 D3 只需将您的 matlab 数据导出为与您的可视化选择相匹配的 JSON 格式JSONLab 之类的东西当然是在 matlab 环境之外可视化的,但是根据上面 Sam 的回答,为稀疏的共现矩阵格式化/创建 JSON 并将其直接加载到类似 D3 viz Haven 的东西很容易还没用过 Circos。
【解决方案5】:

重要更新:

您现在可以通过 FileExchange 提交在 Matlab 中执行此操作:

http://www.mathworks.com/matlabcentral/fileexchange/48576-circulargraph

这里有一个 Matlab 的例子:

http://uk.mathworks.com/examples/matlab/3859-circular-graph-examples

这给出了这种美丽的情节:

【讨论】:

  • 太棒了!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多