Использование цикла for для создания нескольких субплотов Python APLpy
Я пытаюсь создать несколько вложенных участков подгоночных изображений с помощью APLpy, и я хотел бы иметь возможность создавать их с помощью цикла for, чтобы мне не приходилось вводить десятки параметров несколько раз для N графиков.
Используя неэлегичный метод грубой силы, для 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, так как многие другие параметры графика контролируются таким образом, и я хотел бы сделать еще несколько графиков. Я хотел бы заменить эти строки чем-то вроде:
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()
,
Благодарю.
2 ответа
Мне показали путь к решению этого сегодня. 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)')
Недостатком здесь является то, что код, который вы пишете внутри строки, которая должна быть выполнена, не имеет цветового кодирования, как обычно.
Один из способов сделать это - добавить объекты 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()