Javascript 数据可视化:气泡图、维恩图和标记云(天哪!)

Javascript 数据可视化:气泡图、维恩图和标记云(天哪!),javascript,r,charts,visualization,data-visualization,Javascript,R,Charts,Visualization,Data Visualization,假设我有一个很大的对象列表(数千个或上万个),每个对象都有少量标记。 有几十个或数百个可能的标签,它们的使用遵循典型的幂律: 有些标签使用非常频繁,但大多数很少。 事实上,除了最常见的几十个标签外,其他所有标签通常都可以被忽略 现在的问题是如何可视化这些标记之间的关系。 标记云只是它们频率的一个很好的可视化,但它忽略了哪些标记与其他标记一起出现。 假设tag:bar仅出现在同时标记为:foo的对象上。 这应该是显而易见的。 类似地,三个标签往往同时出现 您可以使每个标记成为一个气泡,并让它们彼此

假设我有一个很大的对象列表(数千个或上万个),每个对象都有少量标记。 有几十个或数百个可能的标签,它们的使用遵循典型的幂律: 有些标签使用非常频繁,但大多数很少。 事实上,除了最常见的几十个标签外,其他所有标签通常都可以被忽略

现在的问题是如何可视化这些标记之间的关系。 标记云只是它们频率的一个很好的可视化,但它忽略了哪些标记与其他标记一起出现。 假设tag:bar仅出现在同时标记为:foo的对象上。 这应该是显而易见的。 类似地,三个标签往往同时出现

您可以使每个标记成为一个气泡,并让它们彼此部分重叠。 从技术上讲,这是一个维恩图,但以这种方式处理可能会很麻烦。 例如,Google charts可以创建Venn图,但只能创建3个或更少的集合(标记):
他们把它限制在3盘的原因是,再多的话,它看起来就可怕了。 请参阅Wikipedia页面上的“扩展到更高数量的集合”:

但只有在每个可能的交叉口都不为空的情况下才能这样做。 如果没有超过3个标签同时出现(可能是在扔掉罕见的标签之后),那么一组维恩图就可以工作了(气泡的大小代表标签频率)

或者可能是一个图形(如顶点和边),在视觉上有更厚或更薄的边来表示共现频率

你对工具或库有什么想法或建议吗? 理想情况下,我会用javascript来实现这一点,但我对R和Mathematica之类的东西持开放态度。 如果有人好奇,我很乐意分享一些实际数据(如果我告诉你它代表什么,你会笑)

附录:我最初想到的应用程序是,但我想这也很好地解决了可视化美味书签的问题。

如果你是针对web,我会创建一些东西。连接节点的边可能较厚或颜色较深,也可能是连接它们的力更强,因此它们距离较近。我还会在圆圈内添加标记名

对于这一点,一些非常有用的库包括:

  • (Javascript)
  • (Adobe Flash)
值得研究的其他一些有趣的javascript库包括:


如果我正确理解了您的问题,图像矩阵在这里应该可以很好地工作。我想到的实现是一个nxm矩阵,其中标记的项是行,每个标记类型是一个单独的列。矩阵中的每个单元格将完全由“1”和“0”组成,即,特定项要么有给定的标记,要么没有

在下面的矩阵中(我将其旋转90度,以便更好地适应此窗口——因此列实际上表示标记的项目,每行显示所有项目中是否存在给定标记),我模拟了有8个标记和200个标记项目的场景,“0”为蓝色“1”为浅黄色

该矩阵中的所有值都是随机选择的(每个标记项是从一个由两个标记组成的框中抽取的八个标记,一个为蓝色,一个为黄色(分别为无标记和标记))因此,毫无疑问,这里没有关于模式的视觉证据,但如果你的数据中有一个模式,这种技术非常容易实现,可以帮助你找到它

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


请注意,由于我没有测试它,所以它肯定会工作,但以下是我将如何开始:

您可以按照doug在其回答中的建议创建一个矩阵,但不是将文档作为行,将标记作为列,而是使用一个正方形矩阵,其中标记是行和列。单元格T1;T2的值将是同时标记了T1和T2的文档数(请注意,这样做会得到一个符号矩阵,因为[T1;T2]将具有与[T2;T1]相同的值。
完成后,每一行(或列)是一个向量,用于在具有T维的空间中定位标记。此空间中彼此相邻的标记通常一起出现。若要可视化共现,您可以使用一种方法降低空间维度或任何聚类方法。例如,您可以使用kohonen自组织映射将T维空间投影到2D空间,然后获取一个二维矩阵,其中每个单元格表示标记空间中的一个抽象向量(意味着该向量不必存在于您的数据集中)。该向量反映源空间的拓扑约束,可以视为“模型”向量,反映某些标记的显著共现。此外,此映射上彼此相邻的单元格将表示源空间中彼此接近的向量,从而允许您将标记空间映射到2D矩阵上。

矩阵的最终可视化可以通过多种方式完成,但我不能在不首先看到之前处理的结果的情况下给出建议。

虽然这是一个旧线程,但我今天才发现它

您可能还想考虑使用.< /P> 这是一张世界贫困自组织地图的例子,它使用了39个你称之为“标签”的东西来排列你称之为“对象”的东西


你的问题中似乎遗漏了编程方面的内容。他问他应该使用哪些库。除非他有兴趣阅读一本书,否则这可能是一个编程问题。谢谢Jay!我不知道protovis;那太好了。至于平台/语言,web/javascript是理想的,但如果Mathematica或R或其他什么g有一个很好的方法可以做到这一点,我也很想知道。至于力导向布局,我不喜欢的是它没有捕捉到
# 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))