原文标题 :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]
文章出处登录后可见!