" TypeError n#34;在Python中使用matplotlib制作散点图

时间:2015-02-25 16:11:19

标签: python matplotlib scatter-plot scatter3d

我正在尝试制作一个三维散点图,以便从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()

2 个答案:

答案 0 :(得分:1)

myClasses是一个列表,就像colormap一样。那么你在做什么:

colormap[myClasses]

正在尝试使用其他列表索引列表。这正是你的错误所说的。

您需要执行以下操作:

for class in myClasses:
    ax.scatter(x,y,z, zdir='z', c=colormap[class])

答案 1 :(得分:1)

问题是colormaplist一样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)