多次调用Python绘图函数时,如何保留并对比看跌期权收益率曲线?
解决看跌期权收益率曲线同图对比问题
问题根源
你每次调用函数时都创建了新的绘图窗口(plt.figure(counter)),并且立即调用plt.show(),导致每次只能显示当前函数生成的曲线,无法在同一窗口叠加对比。另外全局变量counter未在函数内声明为全局,导致无法正确递增。
解决方案(同窗口叠加曲线)
如果需要在同一窗口显示所有曲线对比,只需将绘图初始化和显示逻辑移到函数外部,让所有曲线绘制在同一个画布上:
import matplotlib.pyplot as plt import numpy as np def my_function(option, strike, bid, price): if option == "put": # 注:看跌期权标准盈亏平衡点应为 strike - bid,若你的业务逻辑特殊可保留原公式 breakeven = price - bid x = [breakeven - 10, breakeven, price, price + bid] y = [0] * len(x) # 用for循环替代while,代码更简洁 for i in range(len(x)): if x[i] < price: y[i] = (-x[i] + breakeven) * 100 else: y[i] = -100 * bid print(x[i], y[i]) # 在当前画布上绘制曲线,添加清晰标签 plt.plot(x, y, label=f"执行价{strike},权利金{bid}") plt.xlabel('标的价格') plt.ylabel('收益率(%)') plt.legend() # 初始化画布 plt.figure() # 多次调用函数绘制不同参数的曲线 my_function("put", 90, 20, 100) my_function("put", 90, 10, 100) # 统一显示所有曲线 plt.show()
备选方案(多独立窗口)
如果确实需要每个参数对应一个独立窗口,需正确使用全局计数器:
import matplotlib.pyplot as plt import numpy as np counter = 1 def my_function(option, strike, bid, price): global counter # 声明使用全局变量 if option == "put": breakeven = price - bid x = [breakeven - 10, breakeven, price, price + bid] y = [0] * len(x) for i in range(len(x)): if x[i] < price: y[i] = (-x[i] + breakeven) * 100 else: y[i] = -100 * bid print(x[i], y[i]) plt.figure(counter) plt.plot(x, y, label=f"执行价{strike}") plt.xlabel('标的价格') plt.ylabel('收益率(%)') plt.legend() plt.show() counter += 1 my_function("put", 90, 20, 100) my_function("put", 90, 10, 100)
关键修改点
- 同窗口方案:将
plt.figure()和plt.show()移到函数外部,所有曲线绘制完成后统一显示 - 多窗口方案:在函数内用
global counter声明全局变量,确保计数器正确递增 - 添加
plt.legend()区分不同曲线,提升可读性
内容的提问来源于stack exchange,提问作者yjw
相关产品推荐
相关产品推荐

