Python TypeError:列表索引必须是整数或切片,而不是list-matplotlib(散布)

Python TypeError:列表索引必须是整数或切片,而不是list-matplotlib(散布),python,matplotlib,Python,Matplotlib,我正在使用matplotlib绘制数据。我将以此为基础绘制四个标签。下面您可以找到代码。然而,我得到了这个错误 Traceback (most recent call last): File "visualization_SH_Male_female.py", line 86, in <module> main() File "visualization_SH_Male_female.py", line 58, in main plt.scatter(x_li

我正在使用matplotlib绘制数据。我将以此为基础绘制四个标签。下面您可以找到代码。然而,我得到了这个错误

Traceback (most recent call last):
  File "visualization_SH_Male_female.py", line 86, in <module>
    main()
  File "visualization_SH_Male_female.py", line 58, in main
    plt.scatter(x_list[indices], y_list[indices], marker=markers[i], color=colors[j])
TypeError: list indices must be integers or slices, not list

在python中,这不起作用:

a = [1,2,3,4]
b = [2,3]
c = a[b]
因为索引[]需要是整数或切片,而不是列表

最简单的方法是创建一个子列表,只包含列表理解所需的项目。在您的情况下,这是一种方法:

indices = list(map(int, labels == lab))

x_sublist = [x_list[i] for i in range(len(x_list)) if i in indices]
y_sublist = [y_list[i] for i in range(len(y_list)) if i in indices]

plt.scatter(x_sublist, y_sublist, marker=markers[i], color=colors[j])

问题似乎是使用python列表而不是numpy数组。由于代码不可运行,下面是一个简单的示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([.4,.8,1.2,1.6,2.0,2.4])
y = np.array([.1,.2,.3,.7,.6,.5])

lab = np.array([1,1,2,2,1,2])

for l in np.unique(lab):
    indices = (lab == l)
    plt.scatter(x[indices],y[indices], label=str(l))
plt.legend()
plt.show()

然而,我得到了这个错误,TypeError:列表索引必须是整数或切片,而不是散点图中的列表。您应该显示完整的格式化错误回溯。请注意,它将为您提供行号,显示问题发生在代码中的何处。我对问题进行了必要的更改@Karlknechtelt该错误准确地告诉您代码的错误。索引是不能用作其他列表索引的列表。请改为尝试切片或为绘图任务创建子集列表。好的,正如它所说的:索引是您使用前面的行index=listmaint、labels==lab生成的列表。x_列表和y_列表是本机Python列表,而不是Numpy数组;它们不能以这种方式编制索引。我不明白你希望得到什么结果。我最好的猜测是,你应该首先使用某种基于Numpy的X_变换,而不是列表理解……是的,我理解这个错误,我正在试图找到列表到绘图的所有索引@奥弗特菲尔
import numpy as np
import matplotlib.pyplot as plt

x = np.array([.4,.8,1.2,1.6,2.0,2.4])
y = np.array([.1,.2,.3,.7,.6,.5])

lab = np.array([1,1,2,2,1,2])

for l in np.unique(lab):
    indices = (lab == l)
    plt.scatter(x[indices],y[indices], label=str(l))
plt.legend()
plt.show()