如何将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
相关产品推荐
相关产品推荐

