Javascript 数据可视化:气泡图、维恩图和标记云(天哪!)
假设我有一个很大的对象列表(数千个或上万个),每个对象都有少量标记。 有几十个或数百个可能的标签,它们的使用遵循典型的幂律: 有些标签使用非常频繁,但大多数很少。 事实上,除了最常见的几十个标签外,其他所有标签通常都可以被忽略 现在的问题是如何可视化这些标记之间的关系。 标记云只是它们频率的一个很好的可视化,但它忽略了哪些标记与其他标记一起出现。 假设tag:bar仅出现在同时标记为:foo的对象上。 这应该是显而易见的。 类似地,三个标签往往同时出现 您可以使每个标记成为一个气泡,并让它们彼此部分重叠。 从技术上讲,这是一个维恩图,但以这种方式处理可能会很麻烦。 例如,Google charts可以创建Venn图,但只能创建3个或更少的集合(标记):Javascript 数据可视化:气泡图、维恩图和标记云(天哪!),javascript,r,charts,visualization,data-visualization,Javascript,R,Charts,Visualization,Data Visualization,假设我有一个很大的对象列表(数千个或上万个),每个对象都有少量标记。 有几十个或数百个可能的标签,它们的使用遵循典型的幂律: 有些标签使用非常频繁,但大多数很少。 事实上,除了最常见的几十个标签外,其他所有标签通常都可以被忽略 现在的问题是如何可视化这些标记之间的关系。 标记云只是它们频率的一个很好的可视化,但它忽略了哪些标记与其他标记一起出现。 假设tag:bar仅出现在同时标记为:foo的对象上。 这应该是显而易见的。 类似地,三个标签往往同时出现 您可以使每个标记成为一个气泡,并让它们彼此
他们把它限制在3盘的原因是,再多的话,它看起来就可怕了。 请参阅Wikipedia页面上的“扩展到更高数量的集合”: 但只有在每个可能的交叉口都不为空的情况下才能这样做。 如果没有超过3个标签同时出现(可能是在扔掉罕见的标签之后),那么一组维恩图就可以工作了(气泡的大小代表标签频率) 或者可能是一个图形(如顶点和边),在视觉上有更厚或更薄的边来表示共现频率 你对工具或库有什么想法或建议吗? 理想情况下,我会用javascript来实现这一点,但我对R和Mathematica之类的东西持开放态度。 如果有人好奇,我很乐意分享一些实际数据(如果我告诉你它代表什么,你会笑) 附录:我最初想到的应用程序是,但我想这也很好地解决了可视化美味书签的问题。如果你是针对web,我会创建一些东西。连接节点的边可能较厚或颜色较深,也可能是连接它们的力更强,因此它们距离较近。我还会在圆圈内添加标记名 对于这一点,一些非常有用的库包括:
- (Javascript)
- (Adobe Flash)
请注意,由于我没有测试它,所以它肯定会工作,但以下是我将如何开始: 您可以按照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))