簡體   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