Matplotlib图例报错:TypeError: 'list' object is not callable
解决Matplotlib中plt.legend()触发TypeError的问题
问题描述
运行以下Matplotlib绘图代码时,在执行plt.legend(["Linear Graph"])语句触发TypeError: 'list' object is not callable错误,图例无法正常显示:
import matplotlib.pyplot as plt import numpy as np from matplotlib.figure import Figure xaxis = np.array([2, 4, 6, 10, 11, 15]) yaxis = np.array([1, 4, 5, 8, 14, 10]) # figsize = (x, y) figaround = plt.figure(figsize=(8, 6), facecolor = "m", edgecolor = "c", linewidth = "7") jb = figaround.add_axes([1,1,1,1]) jb.plot(xaxis, yaxis, "p-k", ms=12, mec="m", mfc="g") # title plt.title("Linear Graph", fontsize = 25, color = "k") plt.xlabel("X-Axis Data", fontsize = 15) plt.ylabel("Y-Axis Data", fontsize = 15) # x, y axis limit plt.ylim(0, 20) plt.xlim(0, 20) plt.legend(["Linear Graph"]) plt.show()
错误提示:
TypeError: 'list' object is not callable
错误原因
- 核心原因:你之前的代码或会话中,大概率不小心将
plt.legend这个函数名覆盖成了列表对象(比如写过plt.legend = ["some label"]),导致原本的legend()调用变成了试图调用一个列表,触发“列表不可调用”的错误。 - 次要问题:代码混用了Matplotlib的面向对象接口(手动创建的
figaround和jb轴对象)和pyplot状态机接口(plt.title、plt.legend),这种混用容易引发上下文冲突,也增加了调试难度。另外原代码中add_axes([1,1,1,1])的参数不符合规范([left, bottom, width, height]取值应在0-1之间),会导致绘图区域被放在画布外,根本看不到图形。
解决方法
方法1:修复变量覆盖问题
- 检查当前代码会话或脚本的上下文,删除任何将
plt.legend赋值为列表/非函数的语句。 - 如果是交互式环境(比如Jupyter Notebook),重启内核后重新运行代码即可恢复
plt.legend的函数身份。
方法2:改用面向对象接口(推荐)
既然已经手动创建了Figure和Axes对象,直接使用轴对象的方法来设置元素,逻辑更清晰,避免状态机接口的冲突:
import matplotlib.pyplot as plt import numpy as np xaxis = np.array([2, 4, 6, 10, 11, 15]) yaxis = np.array([1, 4, 5, 8, 14, 10]) # 创建Figure,设置画布尺寸和样式 figaround = plt.figure(figsize=(8, 6), facecolor="m", edgecolor="c", linewidth=7) # 修正add_axes参数:[left, bottom, width, height],取值0-1,确保绘图区域在画布内 jb = figaround.add_axes([0.15, 0.15, 0.7, 0.7]) # 绘制图形并捕获返回的线条对象 line, = jb.plot(xaxis, yaxis, "p-k", ms=12, mec="m", mfc="g") # 用Axes对象设置标题和坐标轴标签 jb.set_title("Linear Graph", fontsize=25, color="k") jb.set_xlabel("X-Axis Data", fontsize=15) jb.set_ylabel("Y-Axis Data", fontsize=15) # 设置坐标轴范围 jb.set_ylim(0, 20) jb.set_xlim(0, 20) # 通过Axes对象添加图例 jb.legend([line], ["Linear Graph"]) plt.show()
方法3:使用pyplot状态机接口的规范写法
如果更习惯用plt.xxx的写法,建议在绘图时直接指定label参数,再调用plt.legend()即可,无需手动传列表:
import matplotlib.pyplot as plt import numpy as np xaxis = np.array([2, 4, 6, 10, 11, 15]) yaxis = np.array([1, 4, 5, 8, 14, 10]) plt.figure(figsize=(8, 6), facecolor="m", edgecolor="c", linewidth=7) # 绘图时指定label参数 plt.plot(xaxis, yaxis, "p-k", ms=12, mec="m", mfc="g", label="Linear Graph") plt.title("Linear Graph", fontsize=25, color="k") plt.xlabel("X-Axis Data", fontsize=15) plt.ylabel("Y-Axis Data", fontsize=15) plt.ylim(0, 20) plt.xlim(0, 20) # 直接调用legend,自动读取plot的label plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Jabed Khan
相关产品推荐
相关产品推荐

