4

私は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))

何か案は?

4

3 に答える 3

6

使用している SymPy のバージョンによって異なります。

最新バージョン(0.7.2)では、何でもプロットできることが保証され、バックエンドのmatplotlibとして使用できるプロットモジュールがすでにあります。

古いバージョンlambdifyでは、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 で派手なサブプロット変換を行うだけです。

sympy プロット モジュールを使用すると、ハック的なソリューションよりも他の利点があります。不連続性の検出と適応サンプリング、関数に応じた色付け、病理学的に複雑な記号式の評価 (遅いですが)。

そして明らかに、ドキュメントを確認してください。それらは素晴らしいものではありませんが、多くの質問がそこで回答されています: http://docs.sympy.org/0.7.2/modules/plotting.html sympy のサンプル フォルダーにあるノートブックも確認してください。

編集して、いくつかの追加の質問に対処します。

  1. SymPy のプロット モジュールにはサブプロットの概念はありません。上で述べたように、SymPy は のようなモジュールを再実装しようとmatplotlibしているのではなく、別のモジュール内で簡単に使用するために必要なツールを提供しようとしています (モジュール間のインターフェースは、多くの小さなサブモジュールを含む大きなプロジェクトよりも優れています)。

  2. 2 つの異なる sympy プロットから matplotlib に 2 つのサブプロットを持つ 1 つの Figure を作成するには、次のようにします (matplotlib は Figure のマージをサポートしていないため、これは醜いハックです)。

    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の両方のプロットが含まれます( 2 つのサブプロットではなく、両方の式を持つ 1 つのプロット)。foobar

  4. sympy.plot(..., show=False)場合によっては使いたくなるかもしれません。

于 2013-04-05T13:05:46.277 に答える
1

lambdify()最初の質問では、式を関数に変換するために使用できます。

import numpy as np
from sympy import *

x, y = symbols("x, y")
eq = sqrt(x**2 + y**2)

xa = np.random.rand(10)
ya = np.random.rand(10)
f = lambdify((x, y),eq,'numpy')

print f(xa, ya)
print np.sqrt(xa**2 + ya**2)
于 2013-04-05T12:14:30.700 に答える