2015-04-16 4 views
0

Я пытаюсь создать несколько подзадач для подгонки изображений с использованием APLpy, и я хотел бы создать их через цикл цикла, чтобы не допустить, чтобы мне пришлось вводить десятки параметры несколько раз для N графиков.Использование цикла for для создания нескольких подклассов APLpy Python

Использование безвкусный метод грубой силы, для N = 2 участков может идти, как это:

import aplpy 
import matplotlib.pyplot as plt 

fig = plt.figure() 
f1 = aplpy.FITSFigure("figure1.fits", figure=fig, subplot=[0,0,0.5,0.5]) 
f2 = aplpy.FITSFigure("figure2.fits", figure=fig, subplot=[0.5,0.5,0.5,0.5]) 
# And there are many more images at this point, but let's look at 2 for now. 

f1.show_colorscale() 
f1.add_colorbar() 
f1.frame.set_linewidth(0.75) 
# And many more settings would follow 

# Repeat this all again for the second plot 
f2.show_colorscale() 
f2.add_colorbar() 
f2.frame.set_linewidth(0.75) 

fig.canvas.draw() 
fig.savefig('figure.eps') 

Но я хотел бы, чтобы заменить два набора параметров участка с цикл, так как многие из другие параметры участка контролируются таким образом, и я хотел бы сделать еще несколько графиков. Я хотел бы заменить эти строки что-то вроде:

for i in range(1,3): 
    f{i}.show_grayscale() 
    f{i}.add_colorbar() 
    f{i}.frame.set_linewidth(0.75) 

т.д.

Очевидно, что этот синтаксис не так. По сути, мне нужно иметь возможность модифицировать сам код в цикле for. Я не могу найти, как это сделать в Python, но если бы я делал что-то подобное в .csh, я мог бы написать его, например. f"$i".show_grayscale().

Спасибо.

ответ

0

Мне показали путь к решению этого вопроса сегодня. Команда exec() позволяет выполнить последовательность кода именно таким образом. Решение этого конкретного случая было бы использовать:

for i in range(1,3): 
    exec('f' + str(i) + '.show_grayscale()') 
    exec('f' + str(i) + '.add_colorbar()') 
    exec('f' + str(i) + '.frame.set_linewidth(0.75)') 

Недостатка здесь является то, что код вы пишете внутри строки, которая будет выполнен не имеет цветовую кодировку форматирования, которое было бы нормально иметь.

+0

Это действительно хороший ответ, который когда-либо по электронной почте вам, должно быть, был умный человек .... – astrochris

0

способ сделать это, чтобы добавить свои объекты FITSFigure в список:

fig = plt.figure(figsize=(8,10)) 
gc = [] 
gc.append(aplpy.FITSFigure(img1, subplot=[0.05,0.05,0.9,0.3], figure=fig)) 
gc.append(aplpy.FITSFigure(img2, subplot=[0.05,0.35,0.9,0.3], figure=fig)) 

, то вы можете итерацию с нормальным:

for i in xrange(len(gc)): 
    gc[i].recenter(ra, dec, radius=0.5) 
    gc[i].tick_labels.hide() 
    gc[i].axis_labels.hide()