Matplotlib:RGBA值应在0-1范围内

时间:2019-12-24 09:04:47

标签: python matplotlib

我想散布一些数据点。

我写道:

sumy = sum(np.unique(y_train))+1
yy = y_train/sumy


plt.scatter(
    X_lda.iloc[:,0],
    X_lda.iloc[:,1],
    c=yy,
    cmap='rainbow')

/usr/local/lib/python3.6/dist-packages/matplotlib/colors.py in to_rgba_array(c, alpha)
    277             result[mask] = 0
    278         if np.any((result < 0) | (result > 1)):
--> 279             raise ValueError("RGBA values should be within 0-1 range")
    280         return result
    281     # Handle single values.

ValueError: RGBA values should be within 0-1 range

y_train是0.0到9.0之间的整数,被认为是我要用作该点颜色的每个数据的类。如您所见,我什至尝试按要求在0-1之间对其进行规范化,但仍会引发错误。

2 个答案:

答案 0 :(得分:0)

如果用总和除,通常会得到很小的值,比1小得多。而且,当涉及到负值时,将总和除是无效的。

更好的方法是减去最小值,从而将最低的负值(或正值)设置为零。然后除以(最大值-最小值+一些epsilon)。因此,yy = (ytrain - np.min(ytrain)) / (np.max(ytrain)) - np.min(ytrain) + 1e-6)

有一个matlibfunction norm = mpl.colors.Normalize(vmin,vmax)可以解决这个问题。可以将它作为附加参数添加到大多数与颜色图一起使用的绘图函数中,因此无需创建单独的数组。

用法:

norm = mpl.colors.Normalize(np.min(ytrain), np.maxn(ytrain))
plt.scatter(x, y, c=ytrain, norm=norm, cmap='rainbow')

答案 1 :(得分:0)

以下解决了该问题:

  

matplotlib无法直接处理分类变量。因此,我们将每个类别编码为数字,以便将类别标签合并到绘图中。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y_train)
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.scatter(
    X_lda.iloc[:,0].real,
    X_lda.iloc[:,1].real,
    c=y,
    cmap='rainbow',
    alpha=0.7)