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

如何在Matlab中将相关矩阵可视化为schemaball,matlab,plot,visualization,correlation,graph-visualization,Matlab,Plot,Visualization,Correlation,Graph Visualization,我有42个变量,我在Matlab中计算了它们的相关矩阵。现在我想用一个schemaball来形象化它。有没有人对如何在Matlab中实现这一点有任何建议/经验?以下图片将更好地解释我的观点: 在图片中,变量之间的每条抛物线表示它们之间的相关性强度。线越粗,相关性越强。我更喜欢图片1的风格,而不是图片2中的风格,我使用了不同的颜色来突出相关性的强度 巧合的是,克里夫·莫勒(MathWorks首席数学家)在他最近的一篇文章中展示了一个此类情节的例子(没有你的例子那么漂亮,连接线是直线而不是抛物线

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


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

巧合的是,克里夫·莫勒(MathWorks首席数学家)在他最近的一篇文章中展示了一个此类情节的例子(没有你的例子那么漂亮,连接线是直线而不是抛物线,但看起来很实用)。不幸的是,他没有直接包含代码,但如果你在帖子上给他留言,他通常非常愿意分享

对您来说更好的是,他还应用(这次包括)代码来排列数组的行/列,以最大化高度连接节点的空间接近度,而不是在圆周上随机排列它们。最终得到的是连接线的“新月”形包络线,新月形的粗边表示连接最紧密的节点


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

我想已经完成了。。代码可以找到。 文件中包含文档

黄色/品红颜色(用于正/负相关性)是可配置的,标签的字体大小和打印标签的角度也是可配置的,因此,如果需要,您可以随意选择,而不是沿周长/组/均匀分布

如果您想要打印这些图形或在matlab之外使用它们,我建议使用矢量格式(例如eps)。当你放大/缩小文本时,文本的大小也会改变,这也让人恼火,但我不知道有什么方法可以在不破坏缩放功能的情况下解决这个问题:/

schemaball % demo


我已完成并将我的版本提交到,并将尽快更新链接

与的贡献有一些不同之处:

  • 可以将控制柄返回到图形对象以进行完全手动自定义
  • 标签的方向允许最大的左向右可读性
  • 图形将拉伸以适应标签,而轴保持不变
  • 语法只需要关联矩阵(但允许可选输入)
  • 针对性能进行了优化 遵循演示、定制标签和创造性定制的示例。 注意:第一个图形与一起导出,其他所有图形与一起导出

    默认颜色映射:

    要改善屏幕上的渲染效果,您可以使用实验性的
    -hgVersion2
    开关启动MATLAB,默认情况下,该开关现在会生成抗锯齿图形(源代码:)。但是,如果您尝试保存该图形,该文件将具有通常的旧抗锯齿渲染,因此这里是Gunther schemaball的printscreen图像:


    我最近一直在用MATLAB数据和类似图形进行实验-您可能会对几种相关的循环可视化感兴趣,其中许多是交互式的。另一个有用的、精心制作的、免费提供的选项是,它可能是您在大众媒体上看到的这些图形的大多数更漂亮版本的原因

    重要更新:

    现在,您可以在Matlab中通过FileExchange提交完成此操作:

    这里有一个Matlab示例:

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


    你认为矩阵是对称的吗?那么begative的价值观呢?你也许可以破解它,得到你想要的东西。你可以找到OP图片的来源。我对其进行了一点反向工程,并得出结论,连接线是具有三个控制点的贝塞尔曲线:两个位于圆的边界,第三个位于距圆心的可配置距离(默认值
    0.1*R
    )。如果@OlegKomarov没有通过,我会在今天晚些时候亲自查看,我会尝试使用抛物线,但目前很忙,明天可能会发布一些内容。可能会重复添加它们!您使用的工具箱是什么?要求支持负权重是否太多?i、 黄色为正相关,品红色为负相关?没有工具箱,只有普通的旧matlab(绘图和散布)。当我继续做这项工作时(今天晚些时候),我会设置一个负相关的开关。@horchler我刚刚测试了
    LineSmoothing
    标志,但它没有改变太多,老实说,没有什么区别。这就是为什么我建议在导出时使用矢量格式。我使用这些方法的经验非常好:@guntherstruy真是太棒了!你想过3D版吗;o) @SamRoberts:该代码可在文章中提到的Xerox PARC ftp站点上获得。事实上,在我看到这个问题之前,我刚刚发布了一个基于它的帖子:)我也在写一个函数,对函数的请求可以发布在这里。一旦完成,我将更新我的答案。而且,我不能在评论中发布图片。尝试HG2的+1-它开始看起来非常好。你用哪个版本的MATLAB做的?看看13b预发行版的样子可能会很有趣。@SamRoberts我在R2013a中做过,但不打算探索预发行版。另一方面,我已经制作了我的schemaball版本,但我目前对它的设计不满意,因为它工作得很好,但适用于高维correlati
    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)
    
    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)