【问题标题】:ValueError: s must be a scalar, or the same size as x and yValueError: s 必须是标量,或与 x 和 y 大小相同
【发布时间】:2020-06-01 11:21:34
【问题描述】:
xs=np.array([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25])
ys=np.array([10,12,20,22,21,25,30,21,32,34,35,30,50,45,55,60,66,64,67,72,74,80,79,84])

plt.figure(figsize=(8,6))
sns.scatterplot(x=xs,y=ys,marker='o',s=ys*25,color='g',alpha=0.5)
plt.title('scatter plot')
plt.xlabel('xs value')
plt.ylabel('ys value')
plt.show()

我想画一个气泡图。在使用相同的代码之前,我创建了一个气泡图。但我最近重新安装了所有 anaconda,当我使用此代码时,我不断收到错误 ValueError: s must be a scalar, or the same size as x and y

【问题讨论】:

  • s=ys*25 - 你想做标量乘以数组吗?还是您正在“制作一个重复 25 次的新数组”?通常在 Python 中 list*scalar 是后者,但不知道 numpy - 也许它是前者(更多的数学形式)但被改为后者(遵守 Python 行为)?
  • 是的,numpy 是/应该做数学风格,但也有功能做 - stackoverflow.com/questions/53485221/… 第二个答案
  • 函数 scatterplot 在某些时候执行此操作 self._process_unit_info(xdata=x, ydata=y, kwargs=kwargs)x = self.convert_xunits(x) 将 x 设置为 [ ]

标签: python


【解决方案1】:

代码对我来说很好用。

  • python 3.7.6
  • 熊猫 1.0.3

简而言之,在绘图中使用 s 要求 (a) 您使用标量(单个数字),或 (b) 它的长度与 x 和 y 的长度相匹配,因此可以为每个绘制点分配它的自己的大小。

文本“必须是标量或大小相同”旨在暗示这一点,但可能看起来很神秘。

由于其他人可能很容易遇到此错误,因此我想在此处记录常见原因及其解决方法。

我在执行以下操作时遇到此错误:

df[some_filter].plot.scatter(x='x', y='y', s=df['s'])

原因是 x 和 y 字段使用 df 的子集(左侧的每个过滤器),但比例参数 s 不使用过滤后的 DataFrame。因此 s 的长度与 x & y 的长度不匹配,并且 scatter 不知道如何调整所有点的大小。

如果遇到这种情况,最简单的方法可能是将过滤后的 DataFrame 分配给一个新变量,然后将该变量用于 scatter() 调用和 s 参数。

例子:

temp = df[some_filter]
temp.plot.scatter(x='x', y='y', s=temp['s'])

【讨论】:

猜你喜欢
  • 2020-02-23
  • 2017-05-30
  • 2014-08-25
  • 2022-01-17
  • 1970-01-01
  • 2021-08-17
  • 2020-05-06
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多