使用 SymPy 调整绘图中的轴刻度

问题描述 投票:0回答:1

问题来了: 我有两个隐式函数 F 和 G。我正在尝试找到一种使用 SymPy 绘制它们的方法。

我的问题是,如何调整 x 轴和 y 轴上的刻度,以便我可以看到函数的交叉点?如何为我的情节添加视觉质量?

我尝试过添加“点”来提高质量,但效果不佳。但我不知道如何处理蜱虫

plot sympy implicit xticks yticks
1个回答
1
投票

对于质量,我想您希望提高线条的平滑度。遗憾的是,

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
)

相反,在此代码块中我将修改轴刻度。请注意:

  • 我创建了一个隐藏情节。
  • 然后,我提取了 Matplotlib 的轴以进一步自定义输出。
  • 我创建了
    ticks
    ticks_labels
    。您可以对
    ticks_labels
    进行创意,只要它具有与
    ticks
    相同数量的元素即可。
  • 最后,我使用 Matplotlib 的
    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 为步长添加刻度将使刻度非常难以读取。你必须玩这个步骤。

© www.soinside.com 2019 - 2024. All rights reserved.