Использование цикла 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()
Другие вопросы по тегам