用Python绘制数学素材

2024-06-23 19:44:06 发布

您现在位置:Python中文网/ 问答频道 /正文

在上一个问题中,我曾问过一个包,它允许我用python画圆和箭头,有人建议我试试PyQt4。在

我的问题是,我试图找到可以让我绘制这些小部件的函数,但一直未能做到。在

如果有人知道如何在我的数学圆上画箭头,请告诉我怎么画。在

顺便说一句,如果你们中有人知道Python中的任何一个包可以让我这么做,请帮忙。在

我需要在我的程序中绘制NFA,因此需要这个。在

http://en.wikipedia.org/wiki/File:NFAexample.svg

非常感谢


作为更新,我想说的是,我不仅对PyQt4感兴趣。如果您知道有任何这样的包可以让我用python绘制数学图形用户界面,请帮助:)


Tags: 函数org程序http部件wiki绘制数学
3条回答

使用graphviz您可以制作这样的图表

alt text

使用这样的代码:

#!/usr/bin/env python
# coding: utf-8

import os
import subprocess
import shlex

# dot code based on http://www.graphviz.org/Gallery/directed/fsm.html
dot='''    
digraph finite_state_machine {
        bgcolor="#ffffff"
        rankdir=LR;
        size="8,5"
        node [shape = doublecircle]; S₁ S₃;
        node [shape = circle]; S₀ S₂ S₄;
        node [shape = circle]; S₄; 
        S₀ -> S₁ [ label = ε, weight=-1 ];
        S₀ -> S₃ [ label = ε, weight=-1 ];
        S₁ -> S₂:nw [ label = 0 ];
        S₂ -> S₁:se [ label = 0 ];
        S₁ -> S₁ [ label = 1 ];
        S₂ -> S₂ [ label = 1 ];
        S₃ -> S₄:nw [ label = 1 ];
        S₄ -> S₃:se [ label = 1 ];
        S₃ -> S₃ [ label = 0 ];
        S₄ -> S₄ [ label = 0 ]; 
}
'''
os.chdir('/tmp')
with open('output_dot.svg','w') as outfile:
    subprocess.Popen(shlex.split('dot -Tsvg'),
                     stdin=subprocess.PIPE,stdout=outfile).communicate(dot)

通常,从命令行调用graphvizdot程序。它本身与Python无关。

但是,要以编程方式制作图表,可以使用Python将dot代码构造为一个巨大的字符串,并使用subprocess.Popen通过dot来处理字符串。dot可以多种格式输出,包括SVG或PNG。或者,您可能想研究pygraphviz,以获得一个更“Pythonic”的graphviz库接口。

另外请注意,graphviz支持UTF-8编码字符,因此您可以通过在UTF-8字符集中找到适当的符号来在图表中包含下标和其他数学符号。

graphviz的一个优点是您不必繁琐地指定图的布局,只需说明哪些节点连接到其他节点。节点的位置是由graphviz自动确定的。

这种优势也有点让人衰弱——很难像您希望的那样在图中放置元素。例如,请注意,S1和S2没有水平对齐。我也不知道如何使S0>;S1中的箭头更优美地弯曲,S1和S2之间的箭头完全对称,或者如何使来自S2>;S1的边缘标签显示在箭头下方,等等。。。 我可能不知道该怎么做。

有关graphviz可以做什么的更多示例,请参见graphviz gallery

您可能想看看NetworkX。可能正好适合你的需要!既然你想画画美国橄榄球协会gallery显示了一些可以做的事情。

看看API的这一部分:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicsitem.html

我相信这个类和它的子类会做你想要的。对于某些东西,比如箭头,您可能需要用现有的元素(比如直线)构造它们,或者定义自己的qgraphicsitem子类来实现您想要的功能。

相关问题 更多 >

    热门问题