如何在文本中绘制MatPlotLib上的轴,而不是从CSV文件中获取数字?

时间:2015-02-18 07:15:06

标签: python csv graph matplotlib plot

我有一个看起来像这样的.csv文件(小样本,忽略句点):

Year | Month | Carrier | Elapsed Time

1987 | 10.......|UN.......|15

1987 | 11.......|AM.......|17

1987 | 12.......|HK.......|20

我在MatPlotLib(Python)中绘制3D图形,其中z轴(垂直轴)是经过时间,x轴是月份,y轴是载体。如果我没弄错,MatPlotLib只允许每个轴的值为整数而不是字符串。这就是问题所在:载体值是字符串或字母,例如UN,AM和HK。到目前为止我的代码是:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

readFile = open('/home/andrew/Downloads/1987.txt', 'r')
sepFile = readFile.readlines()[1:50000]
readFile.close()

rect = fig.patch
rect.set_facecolor('white')

X = []
Y = []
Z = []

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    X.append(int(xAndY[1]))
    Y.append(str(xAndY[2])) #Putting str() instead of int() didn't solve the problem
    Z.append(int(xAndY[3]))

ax.scatter(X,Y,Z, c ='r', marker='o')

ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')

plt.show()

据我所知,我可以说x = [UN,AM,HK],但问题是x列表不会从.csv文件中获取。 Python程序不知道哪个点属于哪个运营商名称。我希望能够告诉Python使用每个点的载体名称搜索列,然后能够提取该信息,以便它可以从csv文件中成功绘制,如图所示:

3D Graph Skeleton

我还是一个新手并且掌握了Python,所以我非常感谢你花时间回答。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

汤姆回答了答案,这只是一个改编。

另外,我很确定那里有更好的答案,但这应该适用于你正在做的事情。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

X = {}
Z = {}

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    label = str(xAndY[2])

    if label in x.keys():
        X[label].append(int(xAndY[1]))
        Z[label].append(int(xAndY[3]))
    else:
        X[label] = [int(xAndY[1])]
        Z[label] = [int(xAndY[3])] 

Y=0
for label in X.keys():
    ax.scatter(X[label],Y[-1]*np.ones_like(X[label]),Z[label], c ='r', marker='o')
    Y.append(Y[-1]+1)

ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')

ax.set_yticks(Y)
ax.set_yticklabels(X.keys())

一个好处是每个载体可以有不同的颜色。

答案 1 :(得分:0)

我会使Y轴成为一个整数范围,然后使用你的字符串列表设置yticklabels。类似的东西:

X = []
Y = []
Z = []
Ylabels = []

for plotPair in sepFile:
    xAndY = plotPair.split(',')
    X.append(int(xAndY[1]))
    Y.append(range(len(xAndY[2]))
    Ylabels.append(str(xAndY[2]))
    Z.append(int(xAndY[3]))

ax.scatter(X,Y,Z, c ='r', marker='o')

ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')

ax.set_yticks(Y)
ax.set_yticklabels(Ylabels)