gpt4 book ai didi

python - Sympy:生成具有多个子图的图形

转载 作者:太空狗 更新时间:2023-10-30 02:21:29 24 4
gpt4 key购买 nike

我正在使用 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))

有什么想法吗?

最佳答案

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

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

在旧版本中,您可以选择使用 lambdify,这是一个 hackish,主要是损坏的辅助函数,它返回一个用于 numpy 的快速数值函数。然而,它会因不平凡的表达式而中断。

下面我讲解0.7.2中plotting模块的使用方法:

  1. 只需像 p = plot(expression, (var, start, stop)) 那样调用 plot。如果您有 matplotlib,它将直接使用它。
  2. 如果您想要一些奇特的东西,请提取 matplotlib 图:f = p._backend.fig
  3. 停止关心 SymPy,您的其余工作都在 matplotlib 中。你可以做任何你想做的事。

SymPy 绘图模块背后的想法是能够计算任何可能的表达式,而不是重新实现像 matplotlib 这样的绘图库。因此,只需使用 sympy.plotting.plot 进行评估,并在 matplotlib 中进行花哨的子图转换。

与 hackish 解决方案相比,使用 sympy 绘图模块还有其他优势:检测不连续性和自适应采样、根据函数着色、评估病态复杂的符号表达式(虽然速度慢)。

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

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

  1. 在 SymPy 的绘图模块中没有子图的概念,希望永远不会有。正如我上面提到的,SymPy 并没有尝试重新实现像 matplotlib 这样的模块,而是试图提供必要的工具以便在另一个模块中轻松使用(模块之间的接口(interface)比包含许多小项目的大项目更好)子模块)。

  2. 为了在 matplotlib 中从两个不同的 sympy 图中创建一个带有两个子图的图形(这是一个丑陋的 hack,因为 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()
  3. 为了更新 sympy 图(不是创建子图,只是添加一个新表达式)使用 sympy_p1.append(sympy_p2)。这将导致 sympy_p1 包含 foobar 的图(不是两个子图,而是一个带有两个表达式)。

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

关于python - Sympy:生成具有多个子图的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15833190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com