我有一个以下格式的文本文件。
1 10 3
1 9 2
1 4 5
2 10 2
2 6 5
3 4 3
3 5 4
3 8 1
第一列代表球员。有3个教练。第二列代表球员。总共有10名球员。第三列表示不同教练给予每个球员的等级(最小可以是1最大可以是5)。请注意,并非所有玩家都被评级,只有部分玩家被评级。我基本上想把它作为python中的3d函数用于我的数据。
我想知道这样做的最佳方法是什么?
我的方法
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
with open("test.txt") as f:
data = f.read()
data = data.split('\n')
x = [row.split(' ')[0] for row in data]
y = [row.split(' ')[1] for row in data]
z = [row.split(' ')[2] for row in data]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c='r', marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show()
我的错误
File "solution.py", line 10, in <module>
y = [row.split(' ')[1] for row in data]
IndexError: list index out of range
答案 0 :(得分:1)
默认情况下,拆分适用于空白。当单个拆分产生所有3个值时,对每个变量再次执行拆分也是浪费,并且会使您获得低等级。当然,如果一些玩家没有被评级,你需要在提取等级之前检查一下:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
with open("test.txt") as f:
for row in f:
coordinate = row.split()
if len(coordinate) < 3: # an empty line or don't have a grade
continue
ax.scatter(*coordinate, c='r', marker='o')
plt.show()
你也可以在3个列表中累积x,y和z,并用一次调用绘制散点图,但我认为为每一行绘制一个点代码更少代码=更优雅。