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
相关产品推荐
相关产品推荐

