2016-05-11 1 views
0

Je suis nouveau sur python, donc je suis désolé si c'est trop trivial.Tracer plusieurs ellipses sur la même figure avec les données du fichier texte

Voici un exemple des deux premières lignes du fichier texte.

ra minor_axis major_axis dec position_angle

149,20562 2,29594 0,00418 0,00310 83,40

Chaque ligne du fichier a 5 paramètres qui est nécessaire pour tracer une ellipse. Les deux premières colonnes sont pour le centre. Les 3 colonnes suivantes sont respectivement l'axe principal, l'axe secondaire et l'angle de position. Ce fichier fait partie d'un catalogue énorme qui a beaucoup de lignes. Je veux tracer toutes ces ellipses en une seule figure.

Voici ce que j'ai essayé.

import matplotlib.pyplot as plt 
import numpy as np 
import astropy.io.ascii as asciitable 
from matplotlib.patches import Ellipse 


path=/users/vishnu/Desktop/ 
fw=open(path + 'data_plot.txt', 'r') 
table = asciitable.read(path+ "data_plot.txt") 
ra_degrees=[table['ra']] 
dec_degrees=[table['dec']] 
major_axis_deg=[table['major_axis']] 
minor_axis_deg=[table['minor_axis']] 
position_angle_deg=[table['position_angle']] 



for ra, dec, w, h, angle in zip(ra_degrees, 
dec_degrees,major_axis_deg, minor_axis_deg, position_angle_deg): 
    ellipse = Ellipse(xy=(ra, dec), width=w, height=h, angle=angle) 
    ax.add_patch(ellipse) 
plt.axis('scaled') 
plt.show() 
fw.close() 

Ceci est le journal des erreurs.

runfile('/users/vishnu/.spyder2-py3/radio_sources.py', wdir='/users/vishnu/.spyder2-py3') 
Traceback (most recent call last): 

    File "<ipython-input-299-a0011c0326f5>", line 1, in <module> 
    runfile('/users/vishnu/.spyder2-py3/radio_sources.py', wdir='/users/vishnu/.spyder2-py3') 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 699, in runfile 
    execfile(filename, namespace) 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 88, in execfile 
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace) 

    File "https://stackoverflow.com/users/vishnu/.spyder2-py3/radio_sources.py", line 63, in <module> 
    ax.add_patch(ellipse) 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 1783, in add_patch 
    self._update_patch_limits(p) 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 1803, in _update_patch_limits 
    xys = patch.get_patch_transform().transform(vertices) 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/matplotlib/patches.py", line 1409, in get_patch_transform 
    self._recompute_transform() 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/matplotlib/patches.py", line 1398, in _recompute_transform 
    .scale(width * 0.5, height * 0.5) \ 

    File "https://stackoverflow.com/users/vishnu/anaconda3/lib/python3.5/site-packages/matplotlib/transforms.py", line 1965, in scale 
    np.float_) 

ValueError: setting an array element with a sequence. 

Veuillez également me faire savoir s'il existe une façon plus intelligente de le faire sans avoir besoin de créer des tableaux.

+0

Afficher le retraçage complet. En particulier quelle ligne de votre code a provoqué l'erreur? –

+0

J'ai mis à jour le post maintenant. – Vishnu

Répondre

0

Apparemment, vous devez utiliser une collection PatchCollection, voir this example. Essayez quelque chose comme ça

plt.figure() 
ax = plt.gca() 
ellipses = [] 
plt.xlim([0,100]) 
plt.ylim([0,100]) 
for ra, dec, w ... zip(...): 
    ellipse = Ellipse(xy=(ra, dec), width=w, height=h, angle=angle) 
    ellipses.append(ellipse) 
p = PatchCollection(ellipses) 
ax.add_collection(p) 
plt.show() 
+0

Ceci montre une figure vide sans tracés. L'échelle ne change pas. Comment ajuster automatiquement l'échelle des axes x et y en fonction des données? – Vishnu

+0

vous pouvez ajuster les limites x et y avec plt.xlim et plt.ylim. J'ai édité ma réponse en conséquence. – masat

0

Je devine que le problème est que vous avez un trop grand nombre niveaux d'imbrication sur ra_degrees, etc.

C'est, si vous imprimez table [ « ra »] vous voulez probablement trouver que c'est déjà un tableau. Quand vous l'entourez entre crochets, [table ['ra']] sera alors une liste de longueur. La fonction zip prend un élément de chaque séquence à la fois, donc dans votre boucle for, ra sera assigné à table ['ra'] la première et unique fois à travers la boucle.

Un autre problème est que vous ouvrez le fichier deux fois. Vous passez le nom de fichier à asciitable.read, et n'utilisez jamais réellement fw.

Le code ci-dessous pourrait fonctionner mieux.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
import astropy.io.ascii as asciitable 

path=/users/vishnu/Desktop/ 
table = asciitable.read(path + "data_plot.txt") 

ra_degrees = table['ra'] 
dec_degrees = table['dec'] 
major_axis_deg = table['major_axis'] 
minor_axis_deg = table['minor_axis'] 
position_angle_deg = table['position_angle'] 

for ra, dec, w, h, angle in zip(ra_degrees, dec_degrees, 
     major_axis_deg, minor_axis_deg, position_angle_deg): 
    ellipse = Ellipse(xy=(ra, dec), width=w, height=h, angle=angle) 
    ax.add_patch(ellipse) 
plt.axis('scaled') 
plt.show() 

Si asciitable fonctionne avec un fichier ouvert plutôt qu'un nom de fichier, puis utilisez les éléments suivants à la place:

with open(path + "data_plot.txt") as fw: 
    table = asciitable.read(fw) 

Ceci assure que le fichier est fermé, même s'il y a des erreurs dans asciitable.read cela le fait lever une exception. Étant donné l'erreur ci-dessus, cependant, il semble que vous ayez déjà lu les données.