【问题标题】:"TypeError" in making a scattered plot using matplotlib in Python在 Python 中使用 matplotlib 制作散点图时出现“TypeError”
【发布时间】:2015-04-27 17:40:05
【问题描述】:

我正在尝试制作一个 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()

【问题讨论】:

  • 如果将colormap 设为一个numpy 数组会怎样?例如colormap = np.array([' ', 'r', 'g'])?
  • 尴尬的是我不知道numpy.exists。唉,这是一个初学者的自我贬低之旅:)非常感谢!代码现在看起来很可爱 :) 我能够立即分辨出哪一个分别属于 1 类和 2 类。感谢您忍受我的文字/代码呕吐:D

标签: python matplotlib scatter-plot scatter3d


【解决方案1】:

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

colormap[myClasses]

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

您需要执行以下操作:

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

【讨论】:

    【解决方案2】:

    问题在于colormapmyClasses 一样是list。列表不能用列表(仅整数和切片)进行索引。解决方案是提供一种可以使用列表索引的数据类型——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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2018-02-22
      • 2023-03-05
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多