plt.scatter报错ValueError: setting an array element with a sequence
时间: 2023-11-11 18:57:09 浏览: 226
plt.scatter报错ValueError: setting an array element with a sequence。这个错误通常是因为在调用plt.scatter时,将一个序列作为数组元素进行赋值,而不是单个的数值。要解决这个问题,可以确保在调用plt.scatter时,传递的参数是单个的数值而不是序列。
相关问题
import pandas as pd import numpy as np from sklearn.cluster import KMeans import matplotlib.pyplot as plt def data_input(): data=pd.read_excel('22AI1.xlsx') data=data.dropna(axis=0) data = data.reset_index(drop=True) X=data.身高 Y=data.体重 X=np.array(X).reshape(-1,1) Y=np.array(Y).reshape(-1,1) return X,Y X,Y=data_input()[0],data_input()[1] X_trian=np.concatenate((X,Y),axis=1) clf=KMeans(n_clusters=3) clf.fit(X_trian) print(clf.labels_) plt.scatter(X,Y,c=clf.labels_) plt.show() ,报错ValueError: c of shape (35,) not acceptable as a color sequence for x with size 38, y with size 38
这个报错的原因是 `plt.scatter` 函数的参数 `c` 的形状与输入的 `X` 和 `Y` 的形状不相符。具体来说,`X` 和 `Y` 分别包含了 38 个身高和体重的数值,而 `clf.labels_` 包含了 35 个聚类标签。因此,你需要修改代码,使 `clf.labels_` 的形状与 `X` 和 `Y` 相同,可以通过将 `X` 和 `Y` 中的前 35 个元素与 `clf.labels_` 组合成一个新的数组来实现。修改后的代码如下所示:
```
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def data_input():
data=pd.read_excel('22AI1.xlsx')
data=data.dropna(axis=0)
data = data.reset_index(drop=True)
X=data.身高
Y=data.体重
X=np.array(X).reshape(-1,1)
Y=np.array(Y).reshape(-1,1)
return X,Y
X,Y=data_input()[0],data_input()[1]
X_train=np.concatenate((X,Y),axis=1)
clf=KMeans(n_clusters=3)
clf.fit(X_train)
labels = np.concatenate((clf.labels_, np.array([np.nan]*3)))
plt.scatter(X,Y,c=labels)
plt.show()
```
这样,就可以正确地显示聚类结果了。请注意,我在新的数组中添加了 3 个 `nan` 值,以便确保 `labels` 数组的长度与 `X` 和 `Y` 数组相同,并避免了 `plt.scatter` 函数的报错。
根据报错:raise ValueError("If using all scalar values, you must pass an index") ValueError: If using all scalar values, you must pass an index,修改代码错误: plt.plot(pre_array, 'g') plt.plot(test_labels, "r") df = pd.DataFrame({'pre_array': pre_array, 'test_labels': test_labels}) sns.lineplot(data=df, x="pre_array", y="test_labels", hue="event") plt.title('LSTM test mae: ' + str(loss_mae.item())) plt.savefig("lstm_test.png") plt.show()
根据错误信息,您需要为 DataFrame 传递一个索引。您可以使用 `range()` 函数生成一个整数索引,代码如下:
```python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# define event
event = ["event"] * len(pre_array)
# create dataframe with index
df = pd.DataFrame({'pre_array': pre_array, 'test_labels': test_labels}, index=range(len(pre_array)))
# plot the data
plt.plot(pre_array, 'g')
plt.plot(test_labels, "r")
sns.lineplot(data=df, x="pre_array", y="test_labels", hue="event")
plt.title('LSTM test mae: ' + str(loss_mae.item()))
plt.savefig("lstm_test.png")
plt.show()
```
在这个版本的代码中,我们使用 `range()` 函数生成了一个长度为 `len(pre_array)` 的整数索引,并将其传递给 DataFrame 的 `index` 参数。这样,您的 DataFrame 就有了一个索引,就不会再出现 "If using all scalar values, you must pass an index" 的错误了。
阅读全文