繁体   English   中英

在Python中使用matplotlib制作散点图时出现“ TypeError”

[英]“TypeError” in making a scattered plot using matplotlib in Python

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

我有三个属性,我想根据前三个attrib值查看它们属于哪个类别(类别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()

myClasses是一个列表,colormap也是如此。 因此,您该怎么做:

colormap[myClasses]

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

您将需要执行以下操作:

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

问题是colormapmyClasses一样都是一个list 列表不能用列表建立索引(只能是整数和切片)。 解决方案是提供一种可以使用列表np.ndarray索引的数据类型np.ndarray立即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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM