You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 核心原因:你之前的代码或会话中,大概率不小心将plt.legend这个函数名覆盖成了列表对象(比如写过plt.legend = ["some label"]),导致原本的legend()调用变成了试图调用一个列表,触发“列表不可调用”的错误。
  2. 次要问题:代码混用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:27:15