Sympy绘图如何添加次Y轴及修改线条样式?
我来帮你搞定Sympy绘图的这两个需求——给第二个表达式加次Y轴,还有修改线条样式。其实这俩都能通过Sympy的plot对象结合它的matplotlib后端来实现,具体操作看下面:
1. 为第二个表达式添加次Y轴
Sympy的plot函数本身没有直接提供次Y轴的参数,但我们可以借助它的matplotlib后端手动创建次轴,把第二个绘图的数据绑定上去。具体步骤如下:
from sympy import symbols from sympy.plotting import plot import matplotlib.pyplot as plt x = symbols('x') # 创建主Y轴的绘图(不直接显示) p1 = plot(x**4, (x,10,20), label='$x^4$', show=False, legend=True) # 创建要放到次Y轴的绘图(同样不直接显示) p2 = plot(x, (x,10,20), line_color='red', label='$x$', show=False, legend=True) # 获取matplotlib的画布和主轴对象 fig, ax_main = p1._backend.fig, p1._backend.ax # 创建次Y轴 ax_secondary = ax_main.twinx() # 提取第二个绘图的x、y数据,绘制到次轴上 series_p2 = p2[0] x_values = series_p2.get_x_range() y_values = [series_p2.expr.subs(x, val) for val in x_values] ax_secondary.plot(x_values, y_values, color=series_p2.line_color, label=series_p2.label) # 调整轴标签和图例 ax_main.set_ylabel('$x^4$') ax_secondary.set_ylabel('$x$') # 合并两个轴的图例,避免重叠 handles_main, labels_main = ax_main.get_legend_handles_labels() handles_sec, labels_sec = ax_secondary.get_legend_handles_labels() ax_main.legend(handles_main + handles_sec, labels_main + labels_sec, loc='upper left') # 显示最终图形 plt.show()
这段代码的核心是通过_backend属性拿到matplotlib的底层对象,然后用twinx()创建共享X轴的次Y轴,最后把第二个绘图的数据手动绘制到次轴上,再统一调整标签和图例。
2. 修改线条样式(比如虚线)
修改线条样式有两种简单的方式,不用深入_backend也能实现:
方式一:创建绘图时直接指定
Sympy的新版本支持直接在plot函数中传递matplotlib的线条样式参数,比如用linestyle(也可以简写为ls)设置虚线:
p2 = plot(x, (x,10,20), line_color='red', label='$x$', show=False, legend=True, linestyle='--')
常用的线条样式值有:
'-'实线(默认)'--'虚线':'点线'-.'点划线
方式二:修改已创建的绘图对象
如果已经创建了plot对象,可以直接修改对应系列的line_style属性:
p2 = plot(x, (x,10,20), line_color='red', label='$x$', show=False, legend=True) # 将线条改为虚线 p2[0].line_style = '--'
要是需要更精细的调整(比如线条宽度、标记点样式),也可以通过_backend拿到matplotlib的线条对象直接修改,比如:
# 获取主绘图的第一条线条,设置宽度为2 p1._backend.ax.lines[0].set_linewidth(2)
内容的提问来源于stack exchange,提问作者Stan Schymanski
相关产品推荐
相关产品推荐

