我有一个看起来像这样的.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文件中成功绘制,如图所示:
我还是一个新手并且掌握了Python,所以我非常感谢你花时间回答。非常感谢您的帮助。
答案 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)