Sympy:生成包含多个子图的图

Uri*_*hen 4 python numpy matplotlib sympy

我正在使用sympy和matplotlib,并希望生成一个包含多个图的图形,类似于使用numpy时使​​用pylab.subplot完成的图形.这应该是微不足道的,或者我认为......

令我惊讶的是,我没有找到一种简单的方法.(a)在多个点评估一个SymPy表达式,得到一个我可以用于matplotlib的numpy数组,或者(b)在sympy.plotting中使用类似于pylab.subplot的机制.

示例代码:

import sympy.plotting.plot as symplot
import sympy as sym
x = sym.Symbol('x')
# This opens two different figures...
symplot(x*x, (x, -10, 10))
symplot(x, (x, -10, 10))
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Kra*_*nov 6

这取决于您使用的SymPy版本.

在最新版本(0.7.2)中,您已经有一个绘图模块,可以保证能够绘制任何内容,并且可以用作后端matplotlib.

在旧版本中,您可以选择使用lambdify哪个是一个hackish,多数是破坏的帮助函数,它返回一个快速数值函数以与numpy一起使用.然而,它打破了非平凡的表达.

下面我将解释如何使用0.7.2中的绘图模块:

  1. 就像打电话plot一样p = plot(expression, (var, start, stop)).如果你有matplotlib它将直接使用它.
  2. 如果你想要一些花哨的东西,请提取matplotlib图:f = p._backend.fig.
  3. 停止关心SymPy,你的其余工作都在matplotlib.你想做什么,就可以做什么.

SymPy绘图模块背后的想法是能够评估任何可能的表达式,而不是重新实现像matplotlib这样的绘图库.所以只需sympy.plotting.plot用于评估,并在matplotlib中进行奇特的子图变换.

使用症状绘图模块具有优于黑客解决方案的其他优点:检测不连续性和自适应采样,根据功能着色,评估病理复杂的符号表达(尽管缓慢).

显然,请查看文档.虽然它们不是很好,但在那里可以回答很多问题:http://docs.sympy.org/0.7.2/modules/plotting.html还要查看sympy示例文件夹中的笔记本.

编辑以解决一些其他问题:

  1. SymPy的绘图模块中没有子图的概念,希望永远不会有一个.正如我上面提到的,SymPy不是试图重新实现模块matplotlib,而是试图提供在另一个模块中易于使用所需的工具(模块之间的接口比具有许多小子模块的大项目更好).

  2. 为了在matplotlib中创建一个带有两个不同情节图的子图(这是一个丑陋的黑客,因为matplotlib不支持图的合并):

    sympy_p1 = sympy.plot(foo)
    sympy_p2 = sympy.plot(bar)
    matplotlib_fig = plt.figure()
    sp1 = matplotlib_fig.add_subplot(121)
    sp2 = matplotlib_fig.add_subplot(122)
    sp1.add_collection(sympy_p1._backend.ax.get_children()[appropriate_index])
    sp2.add_collection(sympy_p2._backend.ax.get_children()[appropriate_index])
    matplotlib_fig.show()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为了更新sympy情节(不创建子图,只添加一个新的表达式)使用sympy_p1.append(sympy_p2).这将导致sympy_p1含有的地块foobar(NOT 2个次要情节,而是一个阴谋与两个表达式).

  4. 您可能希望sympy.plot(..., show=False)在某些情况下使用.