如何在SymPy中绘制x轴降序的图像?实现曲线朝右上角增长的方法
实现SymPy绘图中曲线朝右上角增长及x轴降序的方法
当然可以实现!你遇到的问题是原函数h(p)随p增大而递减,所以曲线呈现从左上到右下的趋势。想要让曲线朝右上角增长,或者让x轴降序排列,有两种简单的解决办法:
方法1:借助Matplotlib底层接口反转x轴
SymPy的plot是基于Matplotlib做的封装,所以我们可以拿到绘图后的Matplotlib轴对象,手动反转x轴的显示顺序。这样不用修改原函数,就能让x轴从大到小排列,曲线自然呈现右上增长的效果。
具体代码如下:
from sympy import symbols, plot p = symbols('p', positive=True) h = (3.731444 - p**0.1902631) / 0.841728e-4 p_low = 150 p_high = 1013.25 # 先创建绘图对象但不显示 plot_obj = plot(h, (p, p_low, p_high), axis_center=(p_low,0), show=False) # 获取轴对象并反转x轴 plot_obj.ax[0].invert_xaxis() # 显示调整后的图像 plot_obj.show()
关键是用show=False延迟显示,这样才能在渲染前修改轴的属性。执行后x轴会从1013.25到150降序排列,曲线就变成从左下到右上的增长趋势了。
方法2:变量替换让函数转为递增形式
如果你希望x轴保持从小到大的顺序,但函数本身是递增的,可以做个变量替换:定义一个新变量q,让q增大时对应的p减小。比如设q = p_high + p_low - p,这样当q从150增加到1013.25时,p会从1013.25减小到150,对应的h值就会递增。
代码示例:
from sympy import symbols, plot p = symbols('p', positive=True) h = (3.731444 - p**0.1902631) / 0.841728e-4 p_low = 150 p_high = 1013.25 # 定义新变量q q = symbols('q', positive=True) # 将p用q表示,代入原函数得到h(q) h_q = h.subs(p, p_high + p_low - q) # 绘制q从p_low到p_high的图像,此时h随q增大而递增 plot(h_q, (q, p_low, p_high), axis_center=(p_low,0))
这样绘制出来的曲线,x轴q从小到大排列,h随q增大而上升,完全符合你想要的“朝右上角增长”的直观效果。
为什么直接反转区间没成功?
SymPy的plot函数要求区间的下限必须小于上限,如果你尝试写(p, p_high, p_low),它会自动交换上下限,所以没法直接通过反转区间参数来实现x轴降序——这就是你之前尝试失败的原因,用上面两种方法就能解决啦。
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

