问题来了: 我有两个隐式函数 F 和 G。我正在尝试找到一种使用 SymPy 绘制它们的方法。
我的问题是,如何调整 x 轴和 y 轴上的刻度,以便我可以看到函数的交叉点?如何为我的情节添加视觉质量?
我尝试过添加“点”来提高质量,但效果不佳。但我不知道如何处理蜱虫
对于质量,我想您希望提高线条的平滑度。遗憾的是,
sympy.plotting.MatplotlibBackend
的编码方式使其无法改进。
为了获得更好的结果,您应该使用SymPy Plotting Backend,它解决了影响
sympy.plotting
的大量问题:
from sympy import *
from spb import *
var("x, y")
e1 = (x**2 + y**2) * (x + y) - 15 * x * y
e2 = (x**4 + y**4) * (x**2 + y**2) - 85 * x**2 * y**2
ranges = (x, -10, 10), (y, -10, 10)
graphics(
implicit_2d(e1, *ranges, color="purple", label="e1"),
implicit_2d(e2, *ranges, color="pink", n=301, label="e2"),
grid=False
)
请注意,我在绘制第二个表达式(离散化点的奇数)时使用了
n=301
。给定您当前的范围,它将在 x=0
和 y=0
上放置一个离散化点,使可视化更加准确。
SymPy 绘图后端默认使用标准 Matplotlib 布局,它将刻度线放置在图形的底部和左侧。这使您的交叉点可见。
最后注意:下次将代码复制为文本,而不是图像。
编辑以满足用户请求:
在此代码块中,我将绘制两条曲线彼此相交的所有解决方案。请注意:
real=True
来创建真实的符号。这将计算真实的解决方案。list_2d
来绘制点列表。rendering_kw
是关键字参数的字典,将提供给 matplotlib 以自定义外观。在这种情况下,它将被传递给 Matplotlib 的 plot
函数。from sympy import *
from spb import *
import numpy as np
var("x, y", real=True)
e1 = (x**2 + y**2) * (x + y) - 15 * x * y
e2 = (x**4 + y**4) * (x**2 + y**2) - 85 * x**2 * y**2
sols = solve([e1, e2], [x, y])
print("solutions:", sols)
# solutions: [(0, 0), (2, 4), (4, 2)]
xx = [s[0] for s in sols]
yy = [s[1] for s in sols]
ranges = (x, -10, 10), (y, -10, 10)
graphics(
implicit_2d(e1, *ranges, color="purple", label="e1"),
implicit_2d(e2, *ranges, color="pink", n=301, label="e2"),
list_2d(xx, yy, scatter=True, label="all solutions"),
list_2d([0], [0], scatter=True, label="my marker", rendering_kw={"marker": "x", "markersize": 10}),
grid=True, show_minor_grid=True
)
相反,在此代码块中我将修改轴刻度。请注意:
ticks
和ticks_labels
。您可以对 ticks_labels
进行创意,只要它具有与 ticks
相同数量的元素即可。plt.show()
来可视化绘图。import numpy as np
import matplotlib.pyplot as plt
p = graphics(
implicit_2d(e1, *ranges, color="purple", label="e1"),
implicit_2d(e2, *ranges, color="pink", n=301, label="e2"),
list_2d(xx, yy, scatter=True, label="all solutions"),
list_2d([0], [0], scatter=True, label="my marker", rendering_kw={"marker": "x", "markersize": 10}),
grid=False, show=False
)
# extract Matplotlib's axes from the plot object, p
ax = p.ax
# create ticks
ticks = np.arange(-10, 10, 0.5)
ticks_labels = [str(t) for t in ticks]
ax.set_xticks(ticks, ticks_labels)
plt.show()
如您所见,以 0.5 为步长添加刻度将使刻度非常难以读取。你必须玩这个步骤。