matplotlib中scatter的相关问题

本文解决了一个在使用matplotlib的scatter函数时遇到的颜色参数问题,详细解释了scatter函数中c参数的正确用法,并提供了正确的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是在学习《tensorflow:实战谷歌深度学习框架》的第四章正则化的代码时,遇到的问题。
如图:
这里写图片描述
为了方便大家可以搜索到,再粘个文字版的错误:

    rgba = _colors_full_map.cache[c, alpha]
TypeError: unhashable type: 'numpy.ndarray'

首先得搞清楚自己面对的是什么样的问题,自己也纠结了很长时间,上网搜索,说什么的都有。
其实,这就是一个参数类型的问题。

引起问题的原因scatter的c参数

一个比较好的scatter函数介绍
第一,c的参数不可以直接是数字,第二点,c不可以是多维数组。

# 正则化,解决过拟合问题
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

data = []
label = []
np.random.seed(0)

# 以原点为圆心,半径为1的圆把散点划分成红蓝两部分,并加入随机噪音。
for i in range(150):
    x1 = np.random.uniform(-1, 1)
    x2 = np.random.uniform(0, 2)
    if x1 ** 2 + x2 ** 2 <= 1:
        data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
        label.append(0)
        #第一处错误,不可以直接是数字
    else:
        data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
        label.append(1)

data = np.hstack(data).reshape(-1, 2)
label = np.hstack(label).reshape(-1,1)
#第二处,不可以使用reshape将label处理为多维数组
plt.scatter(data[:, 0], data[:, 1], c=label,
            cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white")
plt.show()

scatter的c可以接受三类型的变量
1.直接的颜色

import matplotlib.pyplot as plt
x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
plt.scatter(x_coords, y_coords,c='red')
plt.show()

2.颜色组(list格式)

import matplotlib.pyplot as plt

x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
z = ['red','blue','red','blue','red','blue','red']

plt.scatter(x_coords, y_coords,c=z)
plt.show()

3.颜色组(numpy中的ndarray)

import matplotlib.pyplot as plt
import numpy as np
x_coords = [0.13, 0.22, 0.39, 0.59, 0.68, 0.74, 0.93]
y_coords = [0.75, 0.34, 0.44, 0.52, 0.80, 0.25, 0.55]
z = ['red','blue','red','blue','red','blue','red']
z=np.hstack(z)
plt.scatter(x_coords, y_coords,c=z)
plt.show()

因此,作如下修改即可:

# 正则化,解决过拟合问题
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

data = []
label = []
np.random.seed(0)

# 以原点为圆心,半径为1的圆把散点划分成红蓝两部分,并加入随机噪音。
for i in range(150):
    x1 = np.random.uniform(-1, 1)
    x2 = np.random.uniform(0, 2)
    if x1 ** 2 + x2 ** 2 <= 1:
        data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
        label.append('red')
        #第一
    else:
        data.append([np.random.normal(x1, 0.1), np.random.normal(x2, 0.1)])
        label.append('blue')

data = np.hstack(data).reshape(-1, 2)
#label = np.hstack(label).reshape(-1,1) #第二
plt.scatter(data[:, 0], data[:, 1], c=label,
            cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white")
plt.show()

最后说明一下几个问题:
1.np.hstack是一个将列表、元组、ndarray(numpy数组)转化为ndarray的函数
2.ndarray.shape是一个将ndarray转化为指定形状的函数
例如:ndarray.shape(2,3),即转化为两行三列的数组;也可以缺省,比如ndarray.shape(-1,2),即转化为三列的数组,能转多少行就转多少行。

附上出问题的代码链接:代码

这个问题纠结了我两天……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值