<p>这取决于您使用的SymPy版本。在</p>
<p>在最新版本(0.7.2)中,您已经有了一个绘图模块,它保证能够绘制<em>任何</em>的内容,并且可以用作后端matplotlib。在</p>
<p>在旧版本中,您可以选择使用<code>lambdify</code>,这是一个粗制滥造的辅助函数,它返回一个与numpy一起使用的快速数值函数。不过,对于非琐碎的表达式,它会中断。在</p>
<p>下面我解释如何使用0.7.2中的绘图模块:</p>
<ol>
<li>只需调用<code>plot</code>,就像在<code>p = plot(expression, (var, start, stop))</code>中一样。如果你有<code>matplotlib</code>,它将直接使用它。在</li>
<li>如果您想要一些奇特的东西,请提取<code>matplotlib</code>图:<code>f = p._backend.fig</code>。在</li>
<li>别再关心SymPy了,你剩下的工作都在<code>matplotlib</code>。你想做什么都行。在</li>
</ol>
<p>SymPy绘图模块背后的想法是能够计算任何可能的表达式,而不是重新实现像matplotlib这样的绘图库。因此,只需使用<code>sympy.plotting.plot</code>进行求值,并在matplotlib中进行奇妙的子批转换。在</p>
<p>与老套的解决方案相比,使用sympy绘图模块还有其他优点:检测不连续性和自适应采样、根据函数着色、评估病理学上复杂的符号表达式(尽管速度较慢)。在</p>
<p>很明显,检查一下文件。虽然它们不是很好,但有许多问题得到了回答:<a href="http://docs.sympy.org/0.7.2/modules/plotting.html">http://docs.sympy.org/0.7.2/modules/plotting.html</a>还可以查看sympy示例文件夹中的笔记本。在</p>
<p>编辑以解决一些附加问题:</p>
<ol>
<li><p>在SymPy的绘图模块中没有子批次的概念,希望永远不会有。正如我前面提到的,SymPy并不是要重新实现像<code>matplotlib</code>这样的模块,而是试图提供在另一个模块中易于使用所需的工具(模块之间的接口比具有许多小子模块的大项目更好)。</p></li>
<li><p>为了在matplotlib中从两个不同的sympy plot创建一个图形(这是一个难看的方法,因为matplotlib不支持图形的合并):</p>
<pre><code>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()
</code></pre></li>
<li><p>为了更新sympy plot(不是创建子批,只是添加一个新的表达式),请使用<code>sympy_p1.append(sympy_p2)</code>。这将导致<code>sympy_p1</code>同时包含<code>foo</code>和{<cd13>}(<strong>不是</strong>两个子图,而是包含两个表达式的一个plot)。</p></li>
<li><p>在某些情况下,您可能需要使用<code>sympy.plot(..., show=False)</code>。</p></li>
</ol>