You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SymPy符号绘图与基于数据的散点/折线图结合?

解决Sympy绘图叠加决策变量点的问题

我完全懂你的需求——你想用Sympy画出代价函数的等高线和约束区域,还要在同一张图上叠加决策变量的演变点,但直接用plt.scatter()会弹出新的独立窗口,没法和已有图合并。别担心,咱们可以利用Sympy绘图背后的matplotlib轴来解决这个问题。

核心思路是:Sympy的Plot对象其实是基于matplotlib实现的,我们可以获取它对应的matplotlib坐标轴(Axes),然后在这个坐标轴上直接绘制点,而不是用全局的plt.scatter()。

修改后的完整代码

import matplotlib.pyplot as plt
from sympy import symbols, plot_implicit
from sympy.plotting.plot import Plot, ContourSeries

# 定义符号变量与代价函数
(x1, x2) = symbols('x1 x2')
func = x1**4 + x2**4

# 创建代价函数等高线图
p1 = Plot(ContourSeries(func, (x1, -1, 5), (x2, -1, 5)))
# 添加红色约束区域
p1.extend(plot_implicit(x1 < 0, (x1, -1, 5), (x2, -1, 5), line_color='red', show=False))
p1.extend(plot_implicit(x2 < 2, (x1, -1, 5), (x2, -1, 5), line_color='red', show=False))

# 获取Sympy绘图对应的matplotlib坐标轴
ax = p1._backend.ax

# 定义决策变量的演变点(这里用示例数据,你可以替换成自己的迭代点)
x1_evolution = [4, 3.5, 3, 2.5, 2]
x2_evolution = [4, 3, 2.5, 2, 1.5]

# 在已有图上绘制演变点,还可以自定义样式
ax.scatter(x1_evolution, x2_evolution, color='darkblue', marker='o', s=60, label='Decision Variable Path')

# 可选:添加图例、标题等美化元素
ax.legend()
ax.set_title('Cost Function Contours + Constraints + Decision Variable Evolution')

# 显示最终合并后的图形
p1.show()

关键说明

  • 我们通过p1._backend.ax拿到了Sympy绘图对应的matplotlib坐标轴,所有后续的绘图操作都基于这个轴,就不会创建新窗口了。
  • 你可以把x1_evolution和x2_evolution替换成你算法迭代过程中产生的决策变量序列,这样就能直观看到变量的演变路径。
  • 还可以调整scatter的参数(比如color、marker、s)来让点的样式更符合你的需求。

内容的提问来源于stack exchange,提问作者SeBeast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:42:51