【问题标题】:Python draw flowchart, illustration graphs [closed]Python绘制流程图,插图图[关闭]
【发布时间】:2021-04-30 02:17:43
【问题描述】:

有没有python库可以画流程图,图解图如:

【问题讨论】:

    标签: python graph


    【解决方案1】:

    您可以使用 Schemadraw。虽然它的主要目的是制作高质量的电路原理图,但也有一部分可以用来绘制流程图。

    例如: https://schemdraw.readthedocs.io/en/latest/gallery/flowcharting.html#galleryflow

    【讨论】:

      【解决方案2】:

      Network Charts 可能会成功。查看Networkx docs 了解更多详细信息。这也是为大型网络设计的,但是如果您结合其中的一些示例,可以对其进行一些定制以用作流程图。我可以通过一点挖掘来创建它,它可以作为流程图的一个不错的模板。

      import pandas as pd
      import networkx as nx
      import matplotlib.pyplot as plt
      
      plt.figure(figsize = (12,9))
      
      From = ['Food\nProduction', 'Transportation', 'Energy\nProduction',
              "Greenhouse\nGas\nEmissions",'Climate\nChange','Climate\nFeedbacks','Greenhouse\nGas\nEmissions',
              'Climate\nChange']
      To = ["Greenhouse\nGas\nEmissions", "Greenhouse\nGas\nEmissions",
            "Greenhouse\nGas\nEmissions",'Climate\nChange','Climate\nFeedbacks','Greenhouse\nGas\nEmissions',
            'Climate\nChange','Everyone$^{Dies}$']
      
      df = pd.DataFrame({ 'from':From,
                         'to':To})
      # Define Node Positions
      pos = {'Food\nProduction':(1,1),
              'Transportation':(1,2),
              'Energy\nProduction':(1,3),
              'Greenhouse\nGas\nEmissions':(2,2),
              'Climate\nChange':(3,2),
              'Climate\nFeedbacks':(2.5,3),
              'Everyone$^{Dies}$':(4,2)}
      
      # Define Node Colors
      NodeColors = {'Food\nProduction':[1,0,1],
              'Transportation':[1,1,0],
              'Energy\nProduction':[0,1,1],
              'Greenhouse\nGas\nEmissions':[1,.5,1],
              'Climate\nChange':[0,1,0],
              'Climate\nFeedbacks':[0,0,1],
              'Everyone$^{Dies}$':[1,0,0]}
      
      Labels = {}
      i = 0
      for a in From:
          Labels[a]=a
          i +=1
      Labels[To[-1]]=To[-1]
      
      # Build your graph. Note that we use the DiGraph function to create the graph! This adds arrows
      G=nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph() )
      
      # Define the colormap and set nodes to circles, but the last one to a triangle
      Circles = []
      Traingle = []
      Colors_Circles = []
      Colors_Traingle = []
      for n in G.nodes:
          if n != 'Everyone$^{Dies}$':
              Circles.append(n)
              Colors_Circles.append(NodeColors[n])
          else:
              Traingle.append(n)
              Colors_Traingle.append(NodeColors[n])
      
      # By making a white node that is larger, I can make the arrow "start" beyond the node
      nodes = nx.draw_networkx_nodes(G, pos, 
                             nodelist = Circles,
                             node_size=1.25e4,
                             node_shape='o',
                             node_color='white',
                             alpha=1)
      
      nodes = nx.draw_networkx_nodes(G, pos, 
                             nodelist = Circles,
                             node_size=1e4,
                             node_shape='o',
                             node_color=Colors_Circles,
                             edgecolors='black',
                             alpha=0.5)
      
      
      nodes = nx.draw_networkx_nodes(G, pos, 
                             nodelist = Traingle,
                             node_size=1.25e4,
                             node_shape='>',
                             node_color='white',
                             alpha=1)
      
      nodes = nx.draw_networkx_nodes(G, pos, 
                             nodelist = Traingle,
                             node_size=1e4,
                             node_shape='>',
                             node_color=Colors_Traingle,
                             edgecolors='black',
                             alpha=0.5)
      
      
      nx.draw_networkx_labels(G, pos, Labels, font_size=12)
      
      # Again by making the node_size larer, I can have the arrows end before they actually hit the node
      edges = nx.draw_networkx_edges(G, pos, node_size=1.8e4,
                                     arrowstyle='->',width=2,arrowsizes=10)
      
      plt.xlim(0,4.5)
      plt.ylim(0,4)
      plt.axis('off')
      plt.show()
      

      【讨论】:

      • 谢谢六月。我认为node_color=Colors 向我抛出了一个值错误,告诉我 RGBA 转换失败:'c' argument has 7 elements, which is not acceptable for use with 'x' with size 6, 'y' with size 6. 我能做些什么来解决这个问题?谢谢。
      • @BowenLiu 我修好了。将其更改为为圆圈和三角形定义单独的颜色列表
      • 谢谢六月!它现在确实有效。我正在调整你必须实现的类似目标。我想知道,如果to 列单元格之一为空,您能否使其工作?图表中能否有独立节点。如果您有兴趣,这里是我的问题的链接:stackoverflow.com/questions/67308865/…
      • @JuneSkeeter,了不起的解决方案,将采用它来达到我的目的!还有一个小错字:arrowsizes 在 draw_networkx_edges 中应该是单数 arrowsize :)
      【解决方案3】:

      您可能想试试 PyDot: https://code.google.com/p/pydot/

      python版本没试过,不过之前用过Graphviz,挺好用的。

      【讨论】:

      • 我知道 graphviz,但它的图库 [graphviz.org/Gallery.php] 中的图像真的很丑,而且不支持乳胶 (?)。它应该设计用于大型网络图,而不是插图图。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多