【问题标题】:Arched Relationship Infographic In PythonPython中的拱形关系信息图
【发布时间】:2010-12-13 09:19:45
【问题描述】:

这是一个非常具体的信息图挑战,但基本问题是如何使用 matplotlib、cario 或其他 python 库在单词之间构建拱门。

给定以下数据结构。

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

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

灵感来自:相似的多样性。 http://similardiversity.net/

让挑战开始吧!

【问题讨论】:

  • 这是一个有趣的想法。您是否需要它基于矢量进行缩放/打印,或者位图会这样做吗?我担心这一次 Matplotlib 做那种图表会有点难。
  • 我认为最好基于矢量。是的,这对 cario 来说更像是一份工作。超越了数学图表的世界。关于如何处理文本和贝塞尔曲线/拱形以获得这种效果的任何想法?

标签: python matplotlib graphviz graphic


【解决方案1】:

matplotlib 在这里不是正确的库,因为它不是通用图形库。您在这里需要的是 Cairo 之类的东西,或者更简单,您可以使用任何 GUI 工具包的图形功能,例如 PyQt。另一种可行的方法是 PyGame,它也有很好的绘图能力。

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

【讨论】:

    【解决方案2】:

    有几个库,其中至少一个依赖于 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 作为其后端)。它与 Netwworkx 非常相似(相同的首席开发人员)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我想我正在寻找有关人们推荐哪些软件包以及最适合使用哪些功能的见解。这本身并不困难,但是找到最好的包和正确的功能是......
      • @Matt:我认为没有“最好的”库可以解决这个问题,因为这个任务在任何方面都不是特别的。要确定哪一个最适合您的情况,我们需要有关您的要求的更多信息(例如,它是否应该是跨平台的、交互式的、集成到 GUI 中……)。我可能会采用 SVG 的方式,但这只是我自己。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2015-04-19
      • 2014-09-17
      • 1970-01-01
      相关资源
      最近更新 更多