如何用Matplotlib显示曲线交点?遇列表运算报错求助
解决Matplotlib曲线交点计算的问题
嘿,我来帮你搞定这个问题!你遇到的错误unsupported operand type(s) for -: 'list' and 'list'根源很清晰,同时代码里还有几个小细节需要调整,我一步步给你捋清楚:
错误原因拆解
- 列表不支持元素级运算:
x、y、z都是从history['acc']获取的Python列表(list),而y - x这种减法操作只支持numpy数组的元素级运算,列表之间没法直接做相减操作。 - 代码笔误:你写的
test2,.history['acc']多了一个逗号,应该改成test2.history['acc']。 - 曲线绘制逻辑混乱:你原来的
plt.plot(x, y, '-')是把x的acc值当作x轴、y的acc值当作y轴,这和你之前单独绘制三条曲线的逻辑完全不一致(单独绘制时是把训练步数作为x轴、acc作为y轴),会导致坐标体系混乱,根本没法正确计算交点。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt # 修正笔误,同时将列表转换为numpy数组(关键!) x = np.array(test1.history['acc']) y = np.array(test2.history['acc']) z = np.array(test3.history['acc']) # 生成统一的x轴:对应训练的步数/Epochs steps = np.arange(len(x)) # 按你原来正常运行的逻辑绘制三条acc曲线 plt.plot(steps, x, color='green', label='test1 acc') plt.plot(steps, y, color='blue', label='test2 acc') plt.plot(steps, z, color='orange', label='test3 acc') # 计算x和y曲线的交点:找两条曲线acc值符号变化的位置 # np.diff(np.sign(y - x))会在曲线交叉时产生正负切换,argwhere定位这些位置的索引 idx = np.argwhere(np.diff(np.sign(y - x))).flatten() # 绘制x和y的交点:x轴是步数,y轴是对应位置的acc值 plt.plot(steps[idx], y[idx], 'ro', label='x-y交点') # 如果你还需要计算其他曲线的交点,用同样逻辑即可: # idx_xz = np.argwhere(np.diff(np.sign(z - x))).flatten() # plt.plot(steps[idx_xz], z[idx_xz], 'bo', label='x-z交点') plt.legend() plt.xlabel('训练步数/Epochs') plt.ylabel('准确率(Accuracy)') plt.title('多条Acc曲线及交点展示') plt.show()
关键调整说明
- 转成numpy数组:用
np.array()把列表转成数组,这样才能支持y - x这种元素级的减法运算,这是解决报错的核心。 - 统一x轴坐标:用
steps变量表示训练的步数,让三条曲线的x轴保持一致,这样计算出来的交点才是真正意义上的曲线交叉点。 - 修正交点绘制逻辑:原来的
plt.plot(x[idx], y[idx],z[idx], 'ro')参数格式错误,正确的做法是指定x轴为steps[idx],y轴为对应曲线的acc值,用单个标记样式绘制。
这样调整后,代码就能正常计算并显示曲线的交点啦!
内容的提问来源于stack exchange,提问作者Tayyab Vohra
相关产品推荐
相关产品推荐

