Python 图形可视化基础第一部分:流程图

原文标题Graph visualisation basics with Python Part I: Flowcharts

Python 图形可视化基础第一部分:流程图

使用 SchemaDraw 包创建流程图

最近,我的任务是创建一个逻辑树图来表示我工作中的问题解决过程。在逻辑树中,我必须表示各种方程来解决问题。显然,我可以使用 MS PowerPoint 或 Paint 等程序创建逻辑树。但是使用这些程序将是一个手动过程,这可能会导致可视化中的形状和大小出现一些不一致。此外,手动修改这些图可能是一个乏味的过程。

我想自动化这个过程。所以我开始探索用 Python 创建逻辑树的可能性。我遇到了可以满足我目的的不同软件包,例如 networkx 和 graphviz。我想用 Python 探索更多的可能性来代表解决问题的过程。在本系列中,我将分享我对使用 Python 进行图形可视化的不同可能性的发现。在本系列的第一部分中,我将分享我发现的一种使用 SchemDraw 包在 Python 中创建流程图的技术。在接下来的部分中,我将分享使用其他软件包可视化树结构(例如逻辑树和器官图)的方法。让我们开始吧。[0]

该项目的虚拟环境

我首先为这个项目创建一个名为 graphs 的虚拟环境。 Python 虚拟环境为项目创建了一个隔离的环境。这意味着每个项目都有自己的依赖项(Real Python,2018)。使用虚拟环境可以避免全局安装 Python 包,这可能会破坏系统工具或其他项目(PyPA,2022)。

为了创建虚拟环境,我创建了一个 yml 文件,如下所示。它包含此项目所需的依赖项列表。

要使用给定的 yml 文件创建名为 graphs 的虚拟环境,我在终端中运行以下命令:

conda env create -n graphs --file graphs-environment.yml

创建环境后,我使用以下方法激活它:

conda activate graphs

也可以在 jupyter notebook 中为这个虚拟环境创建一个独特的内核,我在终端中使用以下命令创建了这个内核:

python -m ipykernel install --user --name graphs --display-name "graphs"

安装内核后,要在给定环境中运行笔记本,我只需转到内核,更改内核,然后选择图表。如果不再需要环境,也可以使用以下方法轻松删除它:

conda env remove -n graphs

Flowchart

流程图是按顺序表示过程中不同步骤的图片。流程图可以有不同的类型,但它们的主要目的是反映解决问题或实现目标的流程。我记得在我高中的计算机科学课上第一次学习流程图。用笔和纸画出流程图来解决简单的问题,例如计算 n 个数字的总和或打印一个数字序列,在当时是一个有趣的挑战。[0]

在下一节中,我将描述一种使用 SchemDraw 包在 Python 中创建流程图的方法。我将考虑一个问题的例子来检测一个字符串是否是回文。[0]

流程图的元素

由 Colling J. Delker 开发的 SchemDraw 包允许创建高质量的电路原理图。但是,我发现这个包也可以用来创建定制的流程图。[0]

流程图中有六个主要元素。开始或结束节点由椭圆形表示。平行四边形表示用户定义的输入,而矩形表示过程。菱形形状说明了该过程中的决策阶段。不同的形状由尖箭头连接,也称为连接器。使用 SchemDraw,可以通过导入 schemdraw.Drawing() 并为每个元素传递相应的参数和标签,在 Python 中构造这些基本形状。此外,此包允许用户控制元素的大小,例如宽度和高度,以及箭头的方向,如下面的屏幕截图所示。

表示回文问题的流程图

回文是向前或向后读取相同的单词或序列。这个问题的算法非常简单。首先,我要求用户输入一个字符串。接下来,我反转字符串。如果字符串和它的反串相同,则该字符串是回文,如果不是,则不是回文。这个问题可以用 Python 来表述,只是几行代码,如下所示:

string = input(“Enter a string: “)reverse_string = string[::-1]if string == reverse_string:
print (f”{string} is a palindrome.”)

else:
print (f”{string} is not a palindrome.”)

下面的要点中给出了使用 SchemDraw 获取此问题流程图的代码。它以一个起始节点开始,然后是一个用于输入字符串的输入框。接下来,有一个用于反转字符串的过程框,以及一个用于检查字符串及其反转是否相同的菱形框。根据决策是真还是假,有两个不同的箭头从决策框中分叉出来。打印结果后,箭头最终在末端节点达到顶点。

import schemdraw
from schemdraw.flow import *

with schemdraw.Drawing() as d:
    d+= Start().label("Start")
    d+= Arrow().down(d.unit/2)
    
    #Input the string 
    d+= Data(w = 4).label("Enter a string:\n string")
    d+= Arrow().down(d.unit/2)
    
    #Reverse the string
    d+= Box(w = 4).label("Reverse the string:\n reverse_string")
    d+= Arrow().down(d.unit/2)
    
    #Check if string and reverse_string are same
    d+= (decision := Decision(w = 5, h= 5,
                       S = "True",
                        E = "False").label("Is \n string\n == \nreverse_string?"))
    
    #If True
    d+= Arrow().length(d.unit/2)
    d+= (true := Box(w = 5).label("string is a palindrome."))
    d+= Arrow().length(d.unit/2)
    
    #End program
    d+= (end := Ellipse().label("End"))
    
    #If False. Start the arrow from East of decision box
    d+= Arrow().right(d.unit).at(decision.E)
    
    #false is referring to the box where string is not a palindrome.
    d+= (false := Box(w = 5).label("string is not\n a palindrome."))
    
    #Add a downward arrow from the South of false box 
    d+= Arrow().down(d.unit*2.5).at(false.S)
    
    #Extend the arrow to reach the end of the program
    d+= Arrow().left(d.unit*2.15)
    d.save("output/palindrome flowchart.jpeg", dpi = 300)

结果,我得到了如下所示的流程图,也可以保存为图像文件。

Conclusion

图形可视化是一个有趣的概念,用于表示网络、流程(如供应链或问题解决过程)、树结构(如决策树、组织树、逻辑树和文件夹树)。虽然 Python 中有一些可用于数据可视化的复杂包,例如 matplotlib、seaborn、Bokeh、Plotly 等,但仍有一些包可以在 Python 中表示图形和网络,尽管它们并不流行。

在这篇文章中,我首先为这个项目创建了一个虚拟环境。然后我解释了一种使用 SchemDraw 包在 Python 中创建简单流程图的方法。在本系列的后续部分中,我将分享一些我想出的使用 networkx 和 graphviz 等包来表示诸如器官图和逻辑树之类的树结构的方法。

感谢您的阅读!

References

PyPA,2022 年。使用 pip 和虚拟环境安装包。[0]

真正的 Python,2018。Python 虚拟环境:入门。[0]

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年4月28日
下一篇 2022年4月28日

相关推荐