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

