Matplotlib条件设置散点图颜色报错,求解决方法
解决散点图按条件设置颜色的错误问题
错误原因分析
第一个错误:
你在列表推导中使用if x > 0,但x是形状为(100,1)的二维numpy数组,x > 0会生成同形状的布尔数组。numpy不允许直接将多维布尔数组作为if的判断条件(无法确定你要判断“所有元素为真”还是“至少一个元素为真”),因此抛出ValueError。同时你遍历的是x中的元素v,但判断时却用了整个x数组,逻辑本身就错误。第二个错误:
x.all()返回的是一个单一布尔值(判断数组所有元素是否都大于0),你尝试遍历这个布尔值,自然会触发TypeError(布尔值不可迭代),而且这也不符合你“逐个点判断”的需求。
正确解法
方法1:遍历数组元素时正确取值
由于x是二维数组(每个元素是长度为1的子数组),遍历的时候要取出子数组中的数值再判断:
import numpy as np import matplotlib.pyplot as plt x = np.random.randn(100,1) # 用randn生成包含正负的数组,方便测试 y = np.random.rand(100,1) # 取出每个子数组的第一个元素做判断 colors = ['r' if v[0] > 0 else 'b' for v in x] plt.scatter(x, y, c=colors) plt.show()
方法2:将二维数组转为一维后遍历
用flatten()或ravel()把x转成一维数组,简化判断逻辑:
colors = ['r' if v > 0 else 'b' for v in x.flatten()] plt.scatter(x, y, c=colors)
方法3:用numpy向量化操作(更高效)
利用np.where()实现向量化条件判断,避免循环,适合大数据量:
colors = np.where(x > 0, 'r', 'b') plt.scatter(x, y, c=colors)
补充说明
你最初用np.random.rand(100,1)生成的x元素都在[0,1)区间,所有点都会是红色。如果要验证效果,建议换成np.random.randn(100,1)(生成标准正态分布的数值,包含正负)。
内容的提问来源于stack exchange,提问作者Volti
相关产品推荐
相关产品推荐

