数据可视化:气泡图、维恩图和标签云(哦,天呐!)

7
假设我有一个包含成千上万个对象的大列表,每个对象都带有一些标签。 可能有几十个或几百个标签可用,它们的使用遵循典型的幂律分布: 某些标签非常常用,但大多数标签很少使用。 实际上,除了最常见的几十个标签外,其余标签通常可以被忽略。
现在问题是如何可视化这些标签之间的关系。 标签云是仅显示频率的不错的可视化方式,但它忽略了哪些标签与其他标签一起出现的情况。 假设标签:bar 仅出现在同时带有标签:foo 的对象上。 这应该在视觉上明显。 同样适用于倾向于同时出现的三个标签。
你可以将每个标签制作成一个气泡,并让它们部分重叠。 技术上说,这是一个维恩图,但这样处理可能不太方便。 例如,Google图表可以创建维恩图,但仅限于3个或更少的集合(标签): http://code.google.com/apis/chart/docs/gallery/venn_charts.html 他们之所以将其限制为3个集合,是因为超过3个的话,看起来会很糟糕。 请参见维基百科页面上的“扩展到更多集合”:http://en.wikipedia.org/wiki/Venn_diagrams 但这仅适用于每个可能的交集都非空的情况。 如果不超过3个标签共同出现(也许是在放弃罕见标签后),那么一组维恩图可能有效(其中气泡的大小代表标签频率)。
或者,也可以使用图形(如顶点和边),并且通过视觉上较粗或较细的边表示共同出现的频率。

你有任何想法,或者指向工具或库的指针吗? 理想情况下,我会使用javascript来完成,但我也可以接受像R和Mathematica这样的工具或其他任何东西。 如果有人感兴趣,我很乐意分享一些实际数据(如果告诉你它代表什么,你会笑的)。

补充: 我最初考虑的应用程序是TagTime,但我想到这也很好地映射到可视化自己的美味书签的问题。


1
你似乎在问题中漏掉了关于“编程”的部分。 - anon
他询问应该使用哪些库。除非他对借书感兴趣,否则这可能是一个编程问题。 - Jay Askren
4个回答

5
如果我理解你的问题正确,一个图像矩阵在这里应该很好用。我想到的实现方法是一个n x m的矩阵,其中标记的项目是行,每个标签类型是一个单独的列。矩阵中的每个单元格都完全由“1”和“0”组成,即特定项目是否具有给定标签。

在下面的矩阵中(我将其旋转了90度,以便更好地适应此窗口 - 因此列实际上表示带有标记的项目,每行显示所有项目中特定标记的存在或不存在),模拟了存在8个标签200个带标记的项目的情况。, “0”是蓝色的“1”是浅黄色的

此矩阵中的所有值均随机选择(每个带标记的项目都从一个包含两个令牌的盒子中选择八次,一个是蓝色的,一个是黄色的(无标记和标记,分别)。因此,不出所料,这里没有任何视觉证据表明存在一种模式,但如果您的数据确实存在一种模式,这种非常简单易行的技术可以帮助您找到它。

我使用了R来生成和绘制模拟数据,仅使用基本图形(没有外部软件包或库):

# create the matrix
A = matrix(data=r1, nrow=1, ncol=8)

# populate it with random data
for (i in seq(0, 200, 1)){r1 = sample(0:1, 8, replace=TRUE); A = rbind(A, r1)}

# now plot it
image(z=A, ann=F, axes=F, col=topo.colors(12))

alt text


2
我认为这种可视化方式并不能帮助找到数据中的模式,因为有“成千上万的对象”和“数百个标签”。最终的图像可能只是一个巨大的嘈杂图片。 - jeremy-george
1
一个好的排序对于在这种展示中看到模式非常重要。 - hadley

2
如果你的目标是网络,我会创建类似于这样的东西。节点之间连接的边可以更粗或颜色更深,或者增加更强的力使它们距离更近。我还会在圆圈内添加标签名称。
一些非常适合此用途的库包括: 一些其他有趣的值得研究的JavaScript库包括:

谢谢Jay!我不知道protovis,这太好了。至于平台/语言,Web / JavaScript是理想的选择,但如果Mathematica或R或其他某种语言有很好的方法来做到这一点,我也很想知道。至于力导向布局,我不喜欢它没有捕捉到子集关系的问题。也许像这样的东西 - http://vis.stanford.edu/protovis/ex/bubble.html - 但气泡可以相互包含。 - dreeves
再次感谢,Jay。如果我没记错的话,Protovis似乎是JavaScript而不是Flash。 - dreeves

2

1

我不确定这是否有效,因为我没有测试过,但以下是我开始的方式:

您可以按照Doug在他的回答中建议的方式创建矩阵,但是不要将文档作为行和标签作为列,而是采用一个方阵,其中标签作为行和列。单元格T1;T2的值将是标记为T1和T2的文档数量(请注意,这样做会得到对称矩阵,因为[T1;T2]的值与[T2;T1]相同)。 完成后,每行(或列)都是定位标签在T维空间中的向量。在此空间中彼此相近的标记经常出现。为了可视化共现性,您可以使用一种方法来降低空间维数或任何聚类方法。例如,您可以使用Kohonen自组织映射将T维空间投影到二维空间中,然后得到一个二维矩阵,其中每个单元格表示标签空间中的抽象向量(即该向量不一定存在于数据集中)。该向量反映了源空间的拓扑约束,并可视为反映某些标记重要共现性的“模型”向量。此外,在此地图上彼此靠近的单元格将表示在源空间中彼此接近的向量,从而允许您将标记空间映射到二维矩阵上。 矩阵的最终可视化可以用许多方式完成,但是在没有先看到前一个处理结果之前,我无法为您提供建议。

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