48043


初歩的な質問で恐縮です。

sympyのplot_implicit関数を使って陰関数のグラフを作成する際の質問です。  
以下のコードのとおり、pointsに格納されている座標を連続して読み込んで一つの  
グラフに表示させる際はどのようにすれば良いのでしょうか。  
また、pointsの座標点も同時に表示させたいのですが可能でしょうか。

現状、plot_implicitにて描画させているのは単純な円ですでの、別の手段で実現  
可能でしょうが、今後複雑な式の描画も検討しているためplot_implicitを使いつ  
つ実現したいです。

以下にサンプルコードを記載しますが、これではpontsの最後の座標を使った円しか  
描画されません。

[code]

    import math
    import numpy as np
    import matplotlib.pyplot as plt
    from sympy import *
    from sympy.plotting import plot
    from sympy.plotting import plot_implicit
    
    points = np.array([[10,20], [20, 75], [45, 15], [70, 53], [90, 30]])
    weights = np.array([5, 5.1, 5.2, 4.9, 4.8])
    
    x, y = symbols("x y")
    
    for i in range(len(points)):
     G = (x-points[i][0])**2 + (y-points[i][1])**2 - weights[i]**2   
     p2 = plot_implicit(G, (x,0,100), (y,0,100), show=False, line_color='r')
     p2.extend(p2)
    
    p2.show()
    
[/code]


CC BY-SA 4.0
2018-09-03T00:42:48.323
48034
2018-09-03T19:28:21.553
2018-09-03T00:49:45.890
3060
29802
question
python sympy
sympyで作成されるグラフについて


以下の様なコードですと、p2 が毎回変更されてしまいますので、p2 は最後に生成した ImplicitSeries インスタンスだけになってしまいます。

[code]

    p2 = plot_implicit(...)
    p2.extend(p2)
    
[/code]

ですので、以下の様に書き変えてみると良いかと思います。

[code]

    for i in range(len(points)):
      G = (x-points[i][0])**2 + (y-points[i][1])**2 - weights[i]**2
      p = plot_implicit(G, (x,0,100), (y,0,100), show=False, line_color='r')
      if i == 0:
        p2 = p
      else:
        p2.extend(p)
    
[/code]

**追記**

> pointsの座標点も同時に描画したいのですが、ご存知でしょうか。
>
> sympy だけで処理しようとすると、座標点を線で結んでしまいますね。。。matplotlib で sympy
> の式をプロットする様にすれば上手く行くかもしれませんが、少し調べてみます。

sympy の `plot_implicit()` の内部処理を眺めると、方程式から決定される矩形領域を塗り潰しています(fill)。その矩形領域の 4
隅の座標は `ImplicitSeries.get_points()` メソッドで取得できるので、取り出した座標データを matplotlib
で処理できる様な形式に再構成します。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from sympy import *
    
    points = np.array([[10,20], [20, 75], [45, 15], [70, 53], [90, 30]])
    weights = np.array([5, 5.1, 5.2, 4.9, 4.8])
    rangex, rangey = (0, 100), (0, 100)
    
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.set_xlim(rangex)
    ax.set_ylim(rangey)
    ax.set_aspect('equal')
    
    x, y = symbols("x y")
    for (px, py), w in zip(points, weights):
      ax.plot(px, py, marker='.', markersize=3, color='blue')
      ax.annotate('(%d, %d)' % (px, py), 
         xy=(px, py), xytext=(-15, 15),
         textcoords='offset points', ha='right', va='bottom',
         bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.5),
         arrowprops=dict(arrowstyle = '->', connectionstyle='arc3,rad=0'))
      G = (x-px)**2 + (y-py)**2 - w**2
      p = plot_implicit(G, (x,)+rangex, (y,)+rangey, show=False)[0].get_points()[0]
      px, py = [], []
      for (ix, iy) in p:
        px.extend([ix.start, ix.start, ix.end, ix.end, None])
        py.extend([iy.start, iy.end, iy.end, iy.start, None])
      ax.fill(px, py, facecolor='red')
    
    plt.show()
    
[/code]

[![sympy
の実行例](https://i.stack.imgur.com/hotzP.png)](https://i.stack.imgur.com/hotzP.png)


CC BY-SA 4.0
2018-09-03T05:58:23.477
48043
2018-09-03T19:28:21.553
2020-06-17T08:14:45.997
-1
48034
answer