2017-05-18 15 views
1

我一直在使用matplotlib寫了下面的Python腳本策劃:matplotlib.scatter顏色參數不接受numpy的陣列

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() 

當我運行該腳本,我得到以下錯誤:

[email protected] ~/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']除以零誤差並且可以工作。有什麼建議麼?

+0

「Flux」數組的「shape」和「dtype」是什麼?什麼是'np.alltrue(np.isfinite(np.log10(Flux)))'? – user8153

+1

我的建議是閱讀和理解[mcve]。 – ImportanceOfBeingErnest

+0

工作的是float32,不是float64。它們都是1維numpy數組和'np.alltrue(np.isfinite(np.log10(Flux)))== True'。將其轉換爲float32會導致相同的錯誤:TypeError:'numpy.float32'對象不可迭代,現在使用不同的類型。 – jasper

回答

2

Fluxnp.log10(sl['radFlux'])以不同的長度結束。 sl(片段s)未用於計算r2,所以Flux最終變爲大。如果matplotlib檢查顏色數組的長度與scatter x和y數組的長度相同,並且在x和y數組的長度不同時出現錯誤消息,那將會很好。