【问题标题】:Visualizing set hierarchies as color coded graphs将集合层次结构可视化为彩色编码图
【发布时间】:2012-07-03 01:36:59
【问题描述】:

我最近读了很多关于 Java 和 Javascript 的图形库的文章,但我还没有找到一个好方法来做我想做的事。

基本上我有一个关于一堆元素(多达数千个)的集合层次结构。这些集合可以完全或部分重叠、完全覆盖或完全不相交。我想做的是显示以下信息:

  • 集合的大小(相对于其他集合)
  • 根据其涵盖的元素计算出的一组“热”值(以颜色代码表示)
  • 单个图形中集合的完整拓扑(以便向用户显示重叠、交叉等)

编辑:也许我应该举一个例子来说明我所说的集合和元素以及部分重叠的层次结构。以下是我处理的那种集合的过度简化版本(请注意,数字 1-10 和字母 a-hX 表示可相互比较的元素):

Set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
Set2 = {1, 2, 3, 4, 5, 6}
Set3 = {1, 2, 3}
Set4 = {1, 4, 5, 6, 7}
Set5 = {a, b, c, d, e, f, g, h}
Set6 = {a, b, c, d, e}
Set7 = {a, b, c, 7}
Set8 = {2, 4, 7, 8, c, f}
Set9 = {X}

我不确定如何以直观的方式显示这些信息。我看过 Voronoi ¹,² 图表,我真的很喜欢视觉上的,但是它们有不同的数学背景,所以我认为我无法以适当的方式描绘我所拥有的层次结构。我想在运行时(在 Java 的情况下)创建这些图表,或者在 HTML 部署的情况下使用 Javascript,两者都很好。然而,有一个约束条件是图形需要创建或可以导出为高分辨率矢量图形。

简而言之我的问题:

  1. 有没有一种很好的方法来可视化我拥有的数据类型?如果是这样,它是否以易于实现的形式存在(即库)?
  2. 如果问题没有简单的解决方案,换句话说,如果我需要在这种情况下发明轮子,我该如何自己实现这样的图表?什么是好的起点?我需要特别注意什么?

谢谢!

编辑:我的潜在想法是将通用集合中的所有元素布局为具有所需颜色覆盖的六边形网格,然后绘制集合的边界。然而,这个想法有几个问题,特别是为元素指定位置的问题,因此集合不会在整个图上分裂。任何cmets /建议?

【问题讨论】:

  • 我们在谈论多少套?对于小数字,Symmetric Venn diagrams 涵盖所有可能性,但并不特别注意层次结构
  • 肯定有数百,在许多情况下接近一千,有时甚至更多......
  • 您能描述一下这些集合代表什么以及可视化将如何帮助分析吗?
  • 也许你应该看看 Matlab。
  • 和弦图可能是一个有用的工具:mbostock.github.com/d3/ex/chord.html。对每个集合中的元素进行排序,将每个集合表示为圆边缘上的弧,集合交点将由弧之间的弦表示,并且弦颜色可能用作指示相交程度的热图。在该设计中,弧线组合之间可能会绘制多个弦。

标签: java javascript data-visualization graph-algorithm


【解决方案1】:

您是否考虑过二维网格:

  • 将设定的数字放在一个轴上
  • 将所有集合中的唯一元素放在另一个轴上
  • 为在集合中找到元素的每个单元格着色(通过查看该行和列的标签)

虽然这种可视化方法通常不如目前提到的一些更复杂的方法,但它的优点是当您拥有数千个元素和数千个集合时,它实际上是可能的。 p>

诀窍在于以对用户有用的方式将最多信息放在一起的方式对行和列进行排序。我的直觉告诉你,你要解决的问题是使彩色细胞尽可能“像斑点”——如果每组相邻的彩色细胞都被称为一个“区域”,那么不同区域的数量最少,并且他们的洞最少。

这本身就是一个非常复杂的问题,但至少可以通过为每个集合与其他集合计算一些邻接因子来部分解决。您正在寻找的是接近的“岛屿”——所以从一对最相似的集合开始,将它们添加到图表中,并将它们视为一个区域。用替换它所持有的对的区域重新计算您的接近度数(以某种方式平均?)。找到下一个最接近的项目对(每个项目是一个区域或一个集合),如果该对与图中任何现有区域的接近度在某个阈值范围内,则附加到该区域的一侧,否则创建一个新的,单独的区域(再次删除该对的接近度值并重新计算区域本身)。最终,所有集合都将添加到区域中,并且所有区域都将加入。连接两个区域可能有四种可能性(可能需要翻转),因此可以通过两个区域的 4 条边上的集合的接近度来计算要在图中附加哪些边。

虽然这可能永远不会给出最佳配置,但与随机分布相比,它应该会提供一些区域较少的东西。

最后,一些动态重新排序可能很有用,它允许用户选择一个有趣的集合或元素,并将其用作完全重新排列的图形的种子,根据与 那个的接近度计算每个添加> 元素(以及随后与另一个元素组合后的那个区域),而不是任何一个整体的最低接近度。

这是结果图,对您问题中的示例数据集完成了上述逻辑过程:

决定如何对列进行排序很复杂,但基本上你可以通过将列移动到相邻的位置来获得合理的结果,前提是这样的移动不会干扰任何已添加段的彩色块区域。

其他想法:

  • 计算集合的接近度不仅仅是他们有多少共同的元素,还有他们有多少不共同的元素。如果两对集合之间有 3 个共同元素,但其中一对有 5 个非共享元素,另一对有 3 个非共享元素,则具有 3 个非共享元素的对比另一对更接近匹配。
  • 将集合添加到图表后,就有机会对元素进行重新排序。尽可能将元素堆叠在最左边是第一次放置的良好开端。在那之后,将最常见的元素堆叠在最左边似乎很好。在那之后,它崩溃了。我想知道让彩色单元格靠近对角线(从左上角到右下角)是否也是一种有用的算法——这让我想起了Design Structure Matrix,尽管它只显示单向依赖而不是两个-方式关系。
  • 当彩色 blob 包含与所有其他集合完全不相交的集合(如示例中包含 X 的集合)时,可以将其移动到单独的图表中。

【讨论】:

  • 很好的回答 Erik,感谢您抽出宝贵时间!实际上,在我休假一周之前,我经历了类似的事情:) 在我的情况下,我选择了六边形网格,增加了直接邻居的数量,考虑到基础数据,这可能是也可能不是一个明智的选择.我在JS中写了一个布局算法,以螺旋方式构建网格,并将数组中的数据绑定到螺旋中的节点。这减少了对数组中的数据进行排序的问题,这本身就很棘手。
  • 哦,我认为交互性的想法就在这里,我想我必须以某种方式让用户参与进来,因此一直在研究基于 Javascript 的框架,例如 D3.js。
【解决方案2】:

有很多方法可以解决这个问题,但就个人而言,我会使用动态生成的 SVG 和 Raphael JS 之类的工具绘制某种维恩图,并按照我想要的方式着色。此外,Raphael 有像 Set 这样的 API,可以让您提供有关元素及其关系的完整详细信息。 SVG to Code converter 也可能有助于了解如何生成 SVG 元素。

您也可以使用Venn charts 之类的工具:

这似乎很容易适应这种情况。还有Flotr2可以制作气泡图:

甚至Canvas Express

使用任何后期工具进行更多调整将使您能够正确完成它...

【讨论】:

  • 这些对于包含数千个元素的数千个集合似乎不切实际。
【解决方案3】:

是的,这是一个经过充分研究的问题。您所描述的内容称为hypergraph。每个元素都可以表示为图中的一个顶点,集合是超边。然后问题就变成了可视化超图的问题。

不幸的是,没有一个完美的通用解决方案,因为即使是最简单的图表也可能具有复杂的可视化效果。

如果您的集合相对较小(graphviz 这样的常规绘图库。为此,只需连接每组中的所有顶点对并为它们着色。这将产生类似于以下的解决方案:

【讨论】:

  • 感谢您提供术语方面的帮助。 :) 正如您所说,问题是以直观的方式可视化这些类型的图表。我以前看过 Graphviz,它看起来很有趣,但也有点复杂,因为我不确定使用该工具什么是可能的,什么是不可能的。大多数其他类型的可视化库也是如此。我希望有一个有点新的和开箱即用的布局(请参阅:使用 D3 的和弦图作为对 OP 的评论,不幸的是,这也无济于事,但我喜欢独创性)
  • 我不明白第二个图表如何显示集合成员资格。
  • @ErikE 我也有同样的问题。我的猜测是:3套。红蓝黑?!
  • @user77115 但是为什么有三条红线连接相同的两点?这是什么意思?
  • @ErikE 一个详细的例子,基于问题中给出的实际集合,将有助于解释图表的含义。我认为这是一个新的 SO 问题。
【解决方案4】:

我没有以正确格式获取数据的解决方案。看看这个由 MIT 创建的用于构建图表的 javascript 插件,sigmajs。尚未查看它接受的数据,但可能值得一看。

【讨论】:

  • thnx 我会检查一下在这种情况下它是否有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多