这是一个非常具体的信息图挑战,尽管基本问题是如何使用 matplotlib、cario 或其他 python 库在单词之间建立拱门。
给定以下数据结构。
我,你,7 | 我,苹果,9 | 苹果,你,1 | 自行车,我,5
名称将水平显示,其中关系最多的名称比其他名称大,然后名称之间会有加权拱形。一个 10 加权的拱门将是一个 5 加权拱的两倍厚。
灵感来自:相似的多样性。http://similardiversity.net/
让挑战开始吧!
这是一个非常具体的信息图挑战,尽管基本问题是如何使用 matplotlib、cario 或其他 python 库在单词之间建立拱门。
给定以下数据结构。
我,你,7 | 我,苹果,9 | 苹果,你,1 | 自行车,我,5
名称将水平显示,其中关系最多的名称比其他名称大,然后名称之间会有加权拱形。一个 10 加权的拱门将是一个 5 加权拱的两倍厚。
灵感来自:相似的多样性。http://similardiversity.net/
让挑战开始吧!
有几个库,其中至少一个依赖于 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()
正如您所看到的,您可以通过应用一个因子来改变任何“边缘”方法的“权重”参数来缩放边缘,就像我为节点缩放所做的那样。
我还会推荐 pygraphviz(显然使用 graphviz 作为其后端)。它与 Networkx(相同的首席开发人员)非常相似。
我真的不明白困难或挑战在哪里。您所需要的只是一个可以绘制文本和半圆的图形库,这在几乎所有事物中都是可能的。不需要贝塞尔曲线。例如,您可以简单地创建一个 SVG 文件(然后您甚至不需要任何库,并且可以很好地将其嵌入网页中并使用一些 JavaScript 使其具有交互性)。
实际绘图很简单:圆心在两个单词的中间,半径是它们之间距离的一半。然后,您可以调整笔画以反映其他数量。