我在MongoDB中有一个文档集合,每个文档在列表中有一个或多个类别。使用map reduce,我可以获得每个类别的唯一组合有多少个文档的详细信息:
['cat1'] = 523
['cat2'] = 231
['cat3'] = 102
['cat4'] = 72
['cat1','cat2'] = 710
['cat1','cat3'] = 891
['cat1','cat3','cat4'] = 621 ...
其中,总数是指类别精确组合的文档数。
我正在寻找一种合理的方法来呈现这些数据,我认为一个带有比例区域的维恩图是一个好主意。使用上述示例,cat1区域将为523+710+891+621,cat1和cat3之间的重叠区域将为891+621,cat1、cat3、cat4之间的重叠区域将为621等
有人能告诉我如何实现这个目标吗?我最好用Python(+Numpy/MatPlotLib)或MatLab。
问题
我们需要表示对象的多个相互关联的类别的计数,而一个Venn图将不能表示多于一个微不足道的类别及其重叠。
解决办法
将每个类别及其组合视为图中的节点。绘制图形,使节点的大小表示每个类别中的计数,并且边连接相关类别。这种方法的优点是:可以轻松地容纳多个类别,这就变成了一种连接气泡图。
结果
守则
建议的解决方案使用NetworkX创建数据结构,并使用matplotlib绘制数据结构。如果数据以正确的格式显示,这将扩展到具有多个连接的大量类别。
其他解决方案
其他解决方案可能包括:bubble charts、Voronoi diagrams、chord diagrams和hive plots等。没有一个链接的示例使用Python;它们只是为了说明的目的而给出的。
一般来说,这是不可能的,除非交叉点的图形是planar graph并且没有四向交叉点。边的长度也是有限制的(除非您愿意绘制非晶态斑点来表示面积);因此,如果您坚持绘制圆,这甚至会受到限制。
在非常简单的情况下,你可以做一个程序来绘制一个3向维恩图,然后在三元组的“另一边”上“添加”另一个圆。在上面的例子中,
1,3,4
是那个三元组,而2
是奇数个。如果由于您的数据满足上述条件(由于某种原因,您的图形是平面的且极其复杂),和而可能,则可以使用非晶态blob绘制平面图,并缓慢地将每个边“膨胀”为椭球体。你可以用一种放松的方式来做到这一点:如果它们的交叉点低于它们应该的水平,它们就会膨胀;如果它们的交叉点高于它们应该的水平,它们就会收缩。(实际上,它们有两个维度可以做到这一点:肥育和拉长;酌情挑选。拉伸将推动图形的其余部分,因此您必须检查这不会使事情变得不可能,例如使用基于物理弹簧的布局。)最终您可能会收敛到一个答案,您将必须检查其准确性。
我相信ninjagecko是正确的,除非你不介意这个图是n维的,否则一般不能用交叉点图来表示。但是,如果每个类别都有一个显示其所有交叉点的图表,那么它可以用2D表示,而这个图表本身可以是一个单独的图表。因此,这可能是表示数据的更合适的方法。我制作了一个堆积条形图来说明:
代码:
相关问题 更多 >
编程相关推荐