matplotlib.scatter 颜色参数不接受 numpy 数组

matplotlib.scatter color argument not accepting numpy array

我使用 matplotlib 编写了以下 python 绘图脚本:

import pynbody as pyn
import numpy as np
import matplotlib.pyplot as plt
import glob

s = pyn.load('./ballsV2.00001')
sl = s.g[np.where((s.g['z'] < 0.005) & (s.g['z']>-0.005))]

sx = s.s['x'][0]
sy = s.s['y'][0]
sz = s.s['z'][0]
r2 = ((s.g['x']-sx)**2+(s.g['y']-sy)**2+(s.g['z']-sz)**2)
Flux = np.array(1./(4*np.pi*r2)*np.exp(-1*7.00114988051*np.sqrt(r2)))

print(type(np.log10(sl['radFlux'])))
print(type(np.log10(Flux)))

plt.figure(figsize = (15,12))
#plt.scatter(sl['x'],sl['y'],c=np.log10(sl['radFlux']),s=75,edgecolors='none', marker = '.',vmin=-6,vmax=1)
plt.scatter(sl['x'],sl['y'],c=np.log10(Flux),s=75,edgecolors='none', marker = '.',vmin=-8,vmax=4)
plt.xlim([-0.5,0.5])
plt.ylim([-0.5,0.5])
plt.xlabel("x")
plt.ylabel("y")
plt.colorbar(label="log(Code Flux)")
plt.savefig('./ballsV2_0.1.pdf')
plt.savefig('./ballsV2_0.1.png')
plt.show()
plt.close()

当我 运行 脚本时,出现以下错误:

foo@bar ~/Data/RadTransfer/Scaling_Tests/ballsV2 $ py 
balls.py 
balls.py:15: RuntimeWarning: divide by zero encountered in log10
    print(type(np.log10(sl['radFlux'])))
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>

Traceback (most recent call last):
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/colors.py", line 141, in to_rgba
    rgba = _colors_full_map.cache[c, alpha]
KeyError: (-4.1574455411341349, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/colors.py", line 192, in _to_rgba_no_colorcycle
    c = tuple(map(float, c))
TypeError: 'numpy.float64' object is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "balls.py", line 17, in <module>
    plt.scatter(sl['x'],sl['y'],c=np.log10(Flux),s=75,edgecolors='none', marker = '.',vmin=-8,vmax=4)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py", line 3435, in scatter
    edgecolors=edgecolors, data=data, **kwargs)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py", line 1892, in inner
    return func(ax, *args, **kwargs)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py", line 4028, in scatter
    alpha=alpha
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/collections.py", line 890, in __init__
    Collection.__init__(self, **kwargs)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/collections.py", line 139, in __init__
    self.set_facecolor(facecolors)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/collections.py", line 674, in set_facecolor
    self._set_facecolor(c)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/collections.py", line 659, in _set_facecolor
    self._facecolors = mcolors.to_rgba_array(c, self._alpha)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/colors.py", line 237, in to_rgba_array
    result[i] = to_rgba(cc, alpha)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/colors.py", line 143, in to_rgba
    rgba = _to_rgba_no_colorcycle(c, alpha)
  File "/home/grondjj/anaconda3/lib/python3.6/site-packages/matplotlib/colors.py", line 194, in _to_rgba_no_colorcycle
    raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
ValueError: Invalid RGBA argument: -4.1574455411341349

忽略除以零的东西,问题是散点图函数没有使用我的值数组来将颜色映射到。奇怪的是上面注释掉的散点图命令 运行 没问题。唯一的区别是我传递给它的值数组。我确保将它们转换为相同的类型(它们都是 <class 'numpy.ndarray'>)。此外,在 Flux 数组中,这些值本身在 ~4000 和 1E-7 之间更合理,只有 np.log10(sl['radFlux'] 具有被零除的错误并且有效。有什么建议吗?

Fluxnp.log10(sl['radFlux']) 最终长度不同。 sls 的一部分)没有被用来计算 r2,所以 Flux 最终变得太大了。如果 matplotlib 检查颜色数组与散点 x 和 y 数组的长度相同,并且有一条错误消息,就像 x 和 y 数组长度不同时那样,那就太好了。