2016-05-11 9 views
0

Я новичок в python, поэтому я сожалею, если это слишком тривиально.Построение нескольких эллипсов на том же рисунке с данными из текстового файла

Это пример первых двух строк текстового файла.

ра DEC major_axis minor_axis position_angle

149.20562 2,29594 0,00418 0,00310 83,40

Каждая строка файла имеет 5 параметров, которые необходимы для построения одного эллипса. Первые два столбца для центра. Следующие 3 столбца - основная ось, малая ось и угол положения соответственно. Этот файл является частью огромного каталога, который имеет много строк. Я хочу построить все эти эллипсы на одной фигуре.

Вот что я пробовал.

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

Это журнал ошибок.

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. 

Пожалуйста, дайте мне знать, если есть более разумный способ сделать это без необходимости создания массивов.

+0

Опубликовать полную проверку. В частности, какая строка вашего кода вызвала ошибку? –

+0

Я обновил сообщение сейчас. – Vishnu

ответ

0

Похоже, вы должны использовать PatchCollection, см. this example. Попробуйте что-то вроде этого

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

Это показывает пустую фигуру без графиков. Масштаб не изменяется. Как автоматически настроить масштаб оси x и y на основе данных? – Vishnu

+0

вы можете регулировать пределы x и y с помощью plt.xlim и plt.ylim. Я отредактировал свой ответ соответственно. – masat

0

Я предполагаю, что проблема в том, что у вас есть слишком много уровней вложенности на ra_degrees и т.д.

То есть, если вы печатаете таблицы [ «ра»] вы будете вероятно, обнаруживают, что это уже массив. Когда вы заключите его в квадратные скобки, [table ['ra']] будет списком длины один. Функция zip принимает по одному элементу из каждой последовательности за раз, поэтому в вашем цикле for ra будет назначаться таблица ['ra'] первое и единственное время через цикл.

Другая проблема заключается в том, что вы открываете файл дважды. Вы передаете имя файла asciitable.read и никогда не используете fw.

Код ниже может работать лучше.

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

Если asciitable работает с открытым файлом, а не имя файла, а затем использовать следующие вместо:

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

Это гарантирует, что файл закрывается, даже если есть ошибки в asciitable.read что заставляет его возбуждать исключение. Однако, учитывая вышеприведенную ошибку, похоже, что вы уже прочитали данные.