我正在尝试制作一个三维散点图,以便从CSV文件中对数据进行分类。
我有三个属性,我想基于前三个属性值来查看它们属于哪个类(1类或2类)。
到目前为止,我已经成功制作了一个简单的分散图(稍后会添加标签等),我想看看我是否可以按照类别以某种方式对我的情节进行颜色编码。就像我们说的那样,我希望1级地块为红色,2级地块为绿色。
我已经设法编写了一些东西,但继续得到“TypeError:list indices必须是整数,而不是列表”
ax.scatter(x,y,z, zdir='z', c=colormap[categories])
我有点了解错误但却无法想到正确的解决方法。我已经尝试定义一个函数,只是为了对图形进行颜色编码,但它也没有成功。
另外,由于一些非常奇怪的原因,我在数组中的值是用科学记数法打印的。这不是问题,但看起来很疼。如果我只想让它打印成0.00而不是0.0000000e + SomeNumberHere,我真的不确定要为loadtxt的dtype参数添加什么。
有人可以解释这个并且可能会提供一些帮助来纠正吗?谢谢。 这是我的代码:
import numpy as np
import matplotlib.pyplot as pyplot
import csv
myDataset2 = np.loadtxt(open('C:/DM1/DM201501.Assign1.Dataset02.csv', 'rb'),delimiter=',')
print myDataset2
a1=[]
a2=[]
a3=[]
for i in range(100):
a1.append(myDataset2[i][0])
a2.append(myDataset2[i][1])
a3.append(myDataset2[i][2])
from mpl_toolkits.mplot3d import Axes3D
colormap = [' ', 'r', 'g']
myClasses = []
for j in range(100):
if myDataset2[j][3]==1:
myClasses.append(1)
elif myDataset2[j][3]==2:
myClasses.append(2)
x=a1
y=a2
z=a3
fig = pyplot.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x,y,z, zdir='z', c=colormap[myClasses])
pyplot.show()
答案 0 :(得分:1)
myClasses是一个列表,就像colormap一样。那么你在做什么:
colormap[myClasses]
正在尝试使用其他列表索引列表。这正是你的错误所说的。
您需要执行以下操作:
for class in myClasses:
ax.scatter(x,y,z, zdir='z', c=colormap[class])
答案 1 :(得分:1)
问题是colormap
与list
一样myClasses
。列表不能用列表索引(只有整数和切片)。解决方案是提供一个可以使用列表建立索引的数据类型 - 立即想到np.ndarray
。
colormap = np.array([' ', 'r', 'g'])
另一种方法是继续使用两者的列表,但是当你使用列表索引数组时,或多或少地做numpy所做的事情 - 当你去制作情节时,你需要创建一个用于存储颜色数据的新列表(myClasses
中每个项目的一个点):
colors = [colormap[idx] for idx in myClasses]
ax.scatter(x,y,z, zdir='z', c=colors)