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

plt.show()参数报错及自定义类self正确调用方法问题求助

问题原因

1. plt.show()报错原因

Exception has occurred: TypeError
show() takes 1 positional argument but 2 were given

这个报错是因为matplotlib.pyplot.show()方法本身设计为不需要传入任何绘图对象参数,你代码里写的plt.show(plot1)给它传入了scatter3D返回的对象plot1,属于多余传参。
你在Google Colab能正常运行是因为Colab内置的matplotlib版本较低,老版本会自动忽略多余的位置参数;而你Visual Studio环境里的matplotlib版本更高,参数校验更严格,因此触发报错。

2. 自定义类参数调用错误问题

你当前写的MyClass的__init__方法存在多个问题:

  • __init__方法的参数列表里只有show,但你在方法内直接使用了未传入的plot1、data、run_analytics变量,这些变量不会自动从全局作用域绑定到类实例
  • 你没有把需要复用的逻辑封装到类内部,直接把外部函数赋值给实例属性不符合类封装的规范

正确实现方法

基础修复(不需要自定义类的情况)

如果只是需要解决运行报错,不需要封装类的话,直接修改run_analytics里的plt.show调用即可:

def run_analytics(data):
  for i in set(data['MovementNumber'].values):
    print("Plot for Movement Number " + str(i))
    data2 = data.loc[data['MovementNumber'] == i]
    ax = plt.axes(projection='3d')
    xdata = data2['PlayerPosX'].values
    ydata = data2['PlayerPosY'].values
    zdata = data2['PlayerPosZ'].values
    len(xdata)
    plot1 = ax.scatter3D(xdata[:,1], ydata, zdata, c=zdata)
    plt.show() # 仅需去掉传入的plot1参数即可

其余主逻辑不需要修改即可正常运行。

正确封装自定义类的实现

如果需要把逻辑封装到MyClass里,正确写法如下:

import pandas as pd
from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt

class MyClass():
    # 初始化时传入要处理的data即可,不需要传show参数
    def __init__(self, data):
        self.data = data # 把传入的data绑定到实例属性
    
    # 把数据分析方法封装为类的实例方法,第一个参数固定为self
    def run_analytics(self):
        # 类方法内部通过self.data访问绑定的数据集
        for i in set(self.data['MovementNumber'].values):
            print(f"Plot for Movement Number {i}")
            data2 = self.data.loc[self.data['MovementNumber'] == i]
            ax = plt.axes(projection='3d')
            xdata = data2['PlayerPosX'].values
            ydata = data2['PlayerPosY'].values
            zdata = data2['PlayerPosZ'].values
            self.plot1 = ax.scatter3D(xdata[:,1], ydata, zdata, c=zdata) # 把绘图对象绑定到实例属性
            plt.show()

if __name__ == "__main__":
    data = pd.read_csv('Assetslog_912021_11.csv')
    data.columns = ['Time', 'Fixed Delta', 'Movement Time', 'MovementNumber', 'MovementDir', 'Rest Flag', 'DistortionDigit', 'RobotForceX','RobotForceY','RobotForceZ', 'PrevPositionX','PrevPositionY','PrevPositionZ', 'TargetPosX', 'TargetPosY', 'TargetPosZ', 'PlayerPosX', 'PlayerPosX', 'PlayerPosY', 'PlayerPosZ', 'RobotVelX','RobotVelY','RobotVelZ', 'LocalPosX', 'LocalPosY', 'LocalPosZ', 'PerpError' ]  
    data['RobotForce'] = data[['RobotForceX', 'RobotForceY', 'RobotForceZ']].values.tolist()
    data['StartPos'] = data[['PrevPositionX', 'PrevPositionY', 'PrevPositionZ']].values.tolist()
    data['TargetPos'] = data[['TargetPosX', 'TargetPosY', 'TargetPosZ']].values.tolist()
    data['PlayerPos'] = data[['PlayerPosX', 'PlayerPosY', 'PlayerPosZ']].values.tolist()
    data['RobotVel'] = data[['RobotVelX', 'RobotVelY', 'RobotVelZ']].values.tolist()
    # 实例化类,传入数据集
    analytics_obj = MyClass(data)
    # 调用实例的分析方法
    analytics_obj.run_analytics()

该写法中所有实例属性都通过self正确绑定和访问,符合Python类的语法规范。

内容的提问来源于stack exchange,提问作者PeruvianNaplord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:03