Matplotlib散点图报错ValueError:s参数与x/y尺寸不匹配求助
解决Matplotlib散点图的ValueError问题
问题代码
import matplotlib.pyplot as plt import numpy as np import random x = np.random.randint(-100,100,1000) y = np.random.randint(-100,100,1000) size = np.random.rand(100) * 100 mask1 = abs(x) > 50 mask2 = abs(y) > 50 x = x[mask1+mask2] y = y[mask1+mask2] plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7) plt.colorbar() plt.show()
报错信息
ValueError Traceback (most recent call last) Input In [56], in <cell line: 16>() 12 x = x[mask1+mask2] 13 y = y[mask1+mask2] ---> 16 plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7) 17 plt.colorbar() 18 plt.show() ValueError: s must be a scalar, or float array-like with the same size as x and y
错误原因
你用mask1+mask2过滤了x和y,过滤后的x、y长度不再是初始的1000,而size是固定长度100的数组,和过滤后的x、y长度不匹配,触发了Matplotlib的规则:s要么是单个标量(所有点大小一致),要么是和x、y长度完全相同的数组(每个点对应一个大小)。
解决方案
有三种可行的修改方式:
方式一:同步过滤size数组
先把size初始化为和x、y一致的1000长度,再用相同的mask过滤,确保三者长度匹配:import matplotlib.pyplot as plt import numpy as np x = np.random.randint(-100,100,1000) y = np.random.randint(-100,100,1000) size = np.random.rand(1000) * 100 # 初始长度和x、y一致 mask = abs(x) > 50 + abs(y) > 50 x = x[mask] y = y[mask] size = size[mask] # 同步过滤size plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7) plt.colorbar() plt.show()方式二:用标量统一设置点大小
如果不需要每个点大小不同,直接给s传固定数值,比如s=100:plt.scatter(x, y, s=100, c=x, cmap='jet', alpha=0.7)方式三:过滤后生成对应长度的size
先完成x、y的过滤,再根据过滤后的x长度生成size:import matplotlib.pyplot as plt import numpy as np x = np.random.randint(-100,100,1000) y = np.random.randint(-100,100,1000) mask1 = abs(x) > 50 mask2 = abs(y) > 50 x = x[mask1+mask2] y = y[mask1+mask2] size = np.random.rand(len(x)) * 100 # 按过滤后x的长度生成size plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.7) plt.colorbar() plt.show()
内容的提问来源于stack exchange,提问作者laer
相关产品推荐
相关产品推荐

