将数据绘制为来自文本的3d函数

时间:2015-12-06 03:00:35

标签: python

我有一个以下格式的文本文件。

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

1 个答案:

答案 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,并用一次调用绘制散点图,但我认为为每一行绘制一个点代码更少代码=更优雅。