在Python的被成拱形的关系Infographic

时间:2009-11-05 11:24:13

标签: python matplotlib graphviz graphic

这是一个非常具体的inforgraphic challange,尽管这个基本问题是如何使用matplotlib,cario或其他python库在单词之间构建arch。

给出以下数据结构。

我,你,7 | 我,苹果,9 | 苹果,你,1 | 自行车,我,5

名称将水平显示,其中关系最多的名称大于其他名称,然后名称之间会有加权的拱门。 10加权拱的厚度是5加权拱的两倍。

灵感来自:类似的多样化。 http://similardiversity.net/

让挑战开始吧!

3 个答案:

答案 0 :(得分:4)

matplotlib不是正确的库,因为它不是通用图形库。你需要的是Cairo,或者更简单,你可以使用任何GUI工具包的图形功能,比如PyQt。另一种可行的方法是PyGame,它也具有良好的绘图功能。

如果您想要一个示例,请参阅此Cairo samples页面,第一个示例 - arc。您只需编写文本单词,然后将弧形代码用于它们之间的任何宽度和颜色的弧。

答案 1 :(得分:1)

有几个库,其中至少有一个依赖于Matplotlib,可以满足您的需求。我建议使用Networkx(www.networkx.lanl.gov)来构建您的图形结构,然后您可以使用它来调用相关的Matplotlib方法进行绘图。 Networkx和Matplotlib一起工作得非常好。

import networkx as NX
import matplotlib.pyplot as PLT
Gh = NX.Graph()
Gh.add_edge("You", "Bike", weight=1.0)
Gh.add_edge("Bike", "Apple", weight=0.9)
Gh.add_edge("Me", "Bike", weight=1.1)
all_nodes = Gh.nodes()
# to scale node size with degree:
scaled_node_size = lambda(node) : NX.degree(Gh, node) * 700
position = NX.spring_layout(Gh)    # just choose a layout scheme
NX.draw_networkx_nodes(Gh, position, node_size=map(scaled_node_size, all_nodes))
NX.draw_network_edges(Gh, position, Gh.edges(), width=1.0, alpha=1.0, edge_color="red")
# now for the Matplotlib part:
PLT.axis("off")
PLT.show()

正如您所看到的,您可以通过应用因子将'weight'参数改变为任何'edge'方法来缩放边缘,就像我对节点缩放一样。

我还建议使用pygraphviz(显然使用graphviz作为其后端)。它与Netwworkx(同一个主要开发人员)非常相似。

答案 2 :(得分:0)

我真的不知道困难或挑战在哪里。您所需要的只是一个可以绘制文本和半圆的图形库,这在几乎所有内容中都是可能的。不需要Bezier曲线。例如,您可以简单地创建一个SVG文件(然后您甚至不需要任何库,并且可以很好地将其嵌入到网页中并使用一些JavaScript来使其交互)。

实际绘图很简单:圆的中心位于两个单词之间的中间,半径是它们之间距离的一半。然后,您可以调整笔划以反映其他数量。