2017-05-18 2 views
1

J'ai écrit le script de traçage python suivant à l'aide matplotlib:argument couleur matplotlib.scatter ne pas accepter tableau 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() 

Quand je lance le script que je reçois l'erreur suivante:

[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 

Ignorer la diviser par zéro trucs, le problème est la fonction de nuage de points ne prend pas mon tableau de valeurs pour mapper la couleur. Ce qui est étrange, c'est que la commande de diagramme de dispersion commentée ci-dessus fonctionne bien. La seule différence est le tableau de valeurs que je lui transmets. Je me suis assuré de les jeter au même type (ils sont tous les deux <class 'numpy.ndarray'>). De plus, les valeurs elles-mêmes sont plus saines entre ~ 4000 et 1E-7 dans le tableau Flux, c'est seulement le np.log10(sl['radFlux'] qui a la division par zéro des erreurs et que l'on travaille. Aucune suggestion?

+0

Quelles sont les 'shape' et' dtype' du tableau 'Flux'? Qu'est-ce que 'np.alltrue (np.isfinite (np.log10 (Flux)))? – user8153

+1

Ma suggestion serait de lire et de comprendre [mcve]. – ImportanceOfBeingErnest

+0

Celui qui fonctionne est float32 et celui qui ne l'est pas est float64. Ils sont tous les deux des tableaux numériques à 1 dimension et 'np.alltrue (np.isfinite (np.log10 (Flux))) == True'. Le lancer sur float32 donne la même erreur 'TypeError: 'numpy.float32' object n'est pas iterable', maintenant avec un type différent. – jasper

Répondre

2

Flux et np.log10(sl['radFlux']) ont fini par être de différentes longueurs. sl (une tranche de s) n'a pas été utilisé pour calculer r2, donc Flux a fini par être grand. Ce serait bien si matplotlib vérifiait que la matrice de couleurs avait la même longueur que les tableaux scatter x et y et avait un message d'erreur comme quand les tableaux x et y ont des longueurs différentes.