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

Sympy分两次绘图合并后仅首条曲线显示标记的问题

问题:Sympy拆分绘图合并后仅第一条曲线标记可见

我在Sympy中绘制两条曲线时,希望为每条曲线添加标记。单次调用plot函数时标记可以正常显示:

import sympy as sp

x = sp.symbols('x')
sp.plot(x,-x, markers=[{'args' : [5,5, 'r*'], 'ms' : 10},
                      {'args' : [5,-5,'r*'],'ms' : 10}])

但将绘图拆分为两次调用并通过extend合并后,两条曲线都能显示,却只有第一条曲线的标记可见:

p0 = sp.plot(x, markers=[{'args' : [5,5, 'r*'],'ms' : 10}],show=False)
p1 = sp.plot(-x,markers=[{'args' : [5,-5,'r*'],'ms' : 10}], show=False)

p0.extend(p1)
p0.show()

补充说明:拆分绘图调用是为了给每条表达式添加自定义标签。


原因分析

Sympy的Plot对象在执行extend方法时,仅会合并曲线的系列数据,不会自动整合多个Plot实例的markers属性。每个Plot实例的标记信息是独立存储在自身的markers列表中的,extend方法没有处理标记合并的逻辑,因此只有初始Plot对象(也就是示例中的p0)的标记会被渲染。

解决方案

要同时保留自定义标签和两条曲线的标记,只需手动将后续Plot实例的标记合并到初始Plot的markers列表中即可:

import sympy as sp

x = sp.symbols('x')
# 创建带自定义标签和标记的第一个绘图
p0 = sp.plot(x, label='y = x', markers=[{'args': [5, 5, 'r*'], 'ms': 10}], show=False)
# 创建带自定义标签和标记的第二个绘图
p1 = sp.plot(-x, label='y = -x', markers=[{'args': [5, -5, 'r*'], 'ms': 10}], show=False)

# 合并曲线数据
p0.extend(p1)
# 手动合并标记列表
p0.markers.extend(p1.markers)

# 开启图例显示
p0.legend = True
p0.show()

也可以选择直接向初始Plot对象中添加曲线系列,同时设置标签和标记,避免多次Plot实例的创建:

import sympy as sp

x = sp.symbols('x')
# 初始化第一个绘图,带标签和标记
p0 = sp.plot(x, label='y = x', markers=[{'args': [5, 5, 'r*'], 'ms': 10}], show=False)
# 添加第二条曲线并设置标签
p0.append(sp.LineOver1DRangeSeries(-x, sp.Range(-10, 10), label='y = -x'))
# 添加第二条曲线对应的标记
p0.markers.append({'args': [5, -5, 'r*'], 'ms': 10})

p0.legend = True
p0.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:10:11