如何自定义并向Sympy图中添加额外元素?

3

我有几个关于如何使用Sympy处理图形的问题。

我的代码:

from sympy import *
x, y = symbols("x y")
plot_implicit(Eq(x**2 + y**2, 4), (x, -3, 3), (y, -3, 3))

1)该图形被拉伸沿着x轴。

enter image description here

如何使曲线看起来像一个圆?

2)如何向图表添加其他元素。例如,点O(0,0)和直线y = x。

enter image description here


可能相关:https://dev59.com/ElYN5IYBdhLWcg3w2rSU - ImportanceOfBeingErnest
2个回答

5
根据 plot.py 的文档字符串,您可以通过 _backend 属性获取 SymPy 使用的 Matplotlib 轴和图形的后端包装器,然后像其他 Matplotlib 对象一样修改属性。查看此示例:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib notebook
from sympy import *

x, y = symbols("x y")
hp = plot_implicit(Eq(x**2 + y**2, 4), (x, -3, 3), (y, -3, 3))
fig = hp._backend.fig
ax = hp._backend.ax
xx = yy = np.linspace(-3,3)
ax.plot(xx,yy) # y = x
ax.plot([0],[0],'o') # Point (0,0)
ax.set_aspect('equal','datalim')
fig.canvas.draw()

Sympy绘图对象具有append和extend方法,允许将一个绘图对象添加到另一个绘图对象中,但是这种方法在使用Jupyter时可能无法正常工作(至少对我而言如此)。另一种选择是仅使用Matplotlib:
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1,1)
xx,yy = np.linspace(-3,3), np.linspace(-3,3)
x,y = np.meshgrid(xx,yy)
ax.contour(x, y, (x**2+y**2-4), [0]);
ax.plot([0],[0],"o")
ax.plot(xx,yy)
ax.set_aspect('equal','datalim')

第一种选项对我也不起作用。然而,第二种方法是理想的!如果使用eval:ax.contour(x, y, eval(str(a_symbolic_expression)), [0]); - pank
我不知道为什么,但如果我在开头添加plt.ion()并在结尾添加plt.show(block=True),第一种方法对我有效。(Python 3.6.2,matplotlib 1.1.1) - nekketsuuu
1
使用 sympy 1.7.1 版本时,我需要 ax = hp._backend.ax[0] 来获取轴列表中的第一个轴。 - JohanC

1

Sympy的绘图函数有一个参数aspect_ratio=,可以是元组(1,1),表示等比例。

它们还支持markers=annotations=关键字。这些是字典列表,用于matplotlib的plotannotate函数。

from sympy import symbols, Eq, plot_implicit

x, y = symbols("x y")
plot_implicit(Eq(x ** 2 + y ** 2, 4), (x, -3, 3), (y, -3, 3), aspect_ratio=(1, 1),
              markers=[{'args': [0, 0], 'color': "blue", 'marker': "o", 'ms': 5},
                       {'args': [[-3, 3], [-3, 3]], 'color': "blue", 'ls': '-', 'lw': 2}],
              annotations=[{'xy': (0, 0), 'text': "  0", 'ha': 'left', 'va': 'top', 'color': 'blue'},
                           {'xy': (2, 2), 'text': "x=y ", 'ha': 'right', 'va': 'bottom', 'color': 'blue'}])

sympy plot with extra lines, markers and annotations


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接