Как изменить единицы измерения осей на фигуре? - PullRequest
1 голос
/ 11 апреля 2020

Я делаю цифры скоростей некоторых галактик с matplotlib, из некоторых .fits файлов. Проблема в том, что оси на рисунке показывают размер галактики в пикселях, и я хочу отобразить их как Отклонение и Правильное увеличение (в угловых единицах). Я уже знаю, что каждый пиксель имеет размер 0,396 угловых секунд. Как я могу преобразовать пиксели в угловые секунды по осям X и Y?

Код выглядит следующим образом:

##############################################################################
# Generally the image information is located in the Primary HDU, also known
# as extension 0. Here, we use `astropy.io.fits.getdata()` to read the image
# data from this first extension using the keyword argument ``ext=0``:

image_data = fits.getdata(image_file, ext=0)

##############################################################################
# The data is now stored as a 2D numpy array. Print the dimensions using the
# shape attribute:

print(image_data.shape)

##############################################################################
# Display the image data:

fig = plt.figure()
plt.imshow(image_data, cmap='Spectral_r', origin='lower', vmin=-maior_pixel, vmax=maior_pixel)
plt.colorbar()

fig.suptitle(f'{gals_header["MANGAID"]}', fontsize=20, fontweight='bold')

ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)
ax.set_title('RC')

ax.set_xlabel('pixelsx')
ax.set_ylabel('pixelsy')

Существует больше кода, чем это, но я просто хочу показать, что я считаю, что является важной частью (я могу добавить больше в комментариях, если это необходимо). Этот код основан на примере кода по этой ссылке: https://docs.astropy.org/en/stable/generated/examples/io/plot_fits-image.html#sphx -glr-download-генерируется-examples-io-plot-fits-image-py

Я уже пробовал некоторые вещи как Axes.convert_xunits и некоторые pyplot.axes функции, но ничего не работало (или, может быть, я просто не мог понять, как правильно их использовать).

Вот как сейчас выглядит изображение

Может кто-нибудь помочь? Заранее спасибо.

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать все, что захотите, в качестве меток для тиков, используя объект plt.FuncFormatter.

Вот пример (действительно очень глупый), пожалуйста, обратитесь к превосходным документам Matplotlib для подробностей.

import matplotlib.pyplot as plt
from numpy import arange

img = arange(21*21).reshape(21,21)

ax = plt.axes()
plt.imshow(img, origin='lower')
ax.xaxis.set_major_formatter(
    plt.FuncFormatter(lambda x, pos: "$\\frac{%d}{20}$"%(200+x**2)))

enter image description here

Каждая ось имеет major_formatter, который отвечает за создание меток тиков.

Форматер должен быть экземпляром класса подкласса от Formatter, выше мы использовали FuncFormatter.

Для инициализации FuncFormatter мы передаем ему функцию форматирования, которую мы должны определить с помощью следующего required характеристики

  • имеют два входа, x и pos, x - это абсцисса (или ордината), которую нужно отформатировать, тогда как pos можно безопасно игнорировать,
  • возвращает строку, которая будет использоваться в качестве метки.

В этом примере функция была определена на месте с использованием синтаксиса lambda, суть которого - строка формата ("$\\frac{%d}{20}$"%(200+x**2)) который форматирует как LaTeX дробь как функцию абсциссы, как вы можете n см. на рисунке выше.

Re pos параметр, насколько я знаю, он используется только в некоторых методах, например

In [69]: ff = plt.FuncFormatter(lambda x, pos: "%r ፨ %05.2f"%(pos,x))

In [70]: ff.format_ticks((0,4,8,12))
Out[70]: ['0 ፨ 00.00', '1 ፨ 04.00', '2 ፨ 08.00', '3 ፨ 12.00']

, но в целом вы можете игнорировать pos аргумент в теле функции.

...