1

我正在尝试制作一个 3D 散点图来对 CSV 文件中的数据(用于分配)进行分类。

我有三个属性,我想根据前三个属性值查看它们属于哪个类(类 1 或类 2)。

到目前为止,我已经设法制作了一个简单的分散图(标签等稍后添加),我想看看我是否可以根据类对我的图进行颜色编码。就像假设我希望第 1 类地块为红色,第 2 类地块为绿色。

我已经设法编写了一些代码,但不断收到“TypeError:列表索引必须是整数,而不是列表”

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()
4

2 回答 2

1

myClasses 是一个列表,颜色图也是。那么你在做什么:

colormap[myClasses]

正在尝试用另一个列表索引一个列表。这正是你的错误所说的。

您将需要执行以下操作:

for class in myClasses:
    ax.scatter(x,y,z, zdir='z', c=colormap[class])
于 2015-02-25T16:25:51.167 回答
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)
于 2015-02-25T16:26:37.513 回答