Создайте график экваториальных координат RA и DEC с помощью python

Я пытаюсь создать график экваториальных координат, который должен выглядеть примерно так:

введите здесь описание изображения

(Рисунок взят из этой статьи и показывает положение Большого и Малого МС в экваториальных координатах)

Важные вещи, которые следует отметить в отношении этого сюжета:

  • Ось theta (т. е. прямое восхождение) находится в h:m:s (часы, минуты, секунды), как это принято в астрономии, а не в градусах, как параметр polar по умолчанию в matplotlib. .
  • Ось r (т.е.: склонение) увеличивается от -90º, а центр сетки находится в (0h, -90º).
  • График обрезается, то есть отображается только его часть, а не весь круг (как matplotlib по умолчанию).

Используя опцию polar=True в matplotlib, ближайший график, который мне удалось создать, это (MWE ниже, файл данных здесь; некоторые точки отсутствуют по сравнению с изображением выше, так как файл данных немного меньше):

введите здесь описание изображения

Мне также нужно добавить третий столбец данных на график, поэтому я добавляю цветовую полосу и окрашиваю каждую точку в соответствии с массивом z:

введите здесь описание изображения

Итак, что мне сейчас больше всего нужно, так это способ обрезать сюжет. В основном основано на этом вопросе и этот пример @cphlewis довольно близко подошел к его ответ, но некоторые вещи все еще отсутствуют (упомянутые в его ответе).

Будем очень признательны за любую помощь и/или указания по этой проблеме.


MWE

(Обратите внимание, что я использую gridspec для позиционирования подграфика, потому что мне нужно создать несколько из них в одном и том же файле выходного изображения)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

def skip_comments(f):
    '''
    Read lines that DO NOT start with a # symbol.
    '''
    for line in f:
        if not line.strip().startswith('#'):
            yield line

def get_data_bb():
    '''RA, DEC data file.
    '''

    # Path to data file.
    out_file = 'bb_cat.dat'

    # Read data file
    with open(out_file) as f:
        ra, dec = [], []

        for line in skip_comments(f):
            ra.append(float(line.split()[0]))
            dec.append(float(line.split()[1]))

    return ra, dec

# Read RA, DEC data from file.
ra, dec = get_data_bb()
# Convert RA from decimal degrees to radians.
ra = [x / 180.0 * 3.141593 for x in ra]

# Make plot.
fig = plt.figure(figsize=(20, 20))
gs = gridspec.GridSpec(4, 2)
# Position plot in figure using gridspec.
ax = plt.subplot(gs[0], polar=True)
ax.set_ylim(-90, -55)

# Set x,y ticks
angs = np.array([330., 345., 0., 15., 30., 45., 60., 75., 90., 105., 120.])
plt.xticks(angs * np.pi / 180., fontsize=8)
plt.yticks(np.arange(-80, -59, 10), fontsize=8)
ax.set_rlabel_position(120)
ax.set_xticklabels(['$22^h$', '$23^h$', '$0^h$', '$1^h$', '$2^h$', '$3^h$',
    '$4^h$', '$5^h$', '$6^h$', '$7^h$', '$8^h$'], fontsize=10)
ax.set_yticklabels(['$-80^{\circ}$', '$-70^{\circ}$', '$-60^{\circ}$'],
    fontsize=10)

# Plot points.
ax.scatter(ra, dec, marker='o', c='k', s=1, lw=0.)

# Use this block to generate colored points with a colorbar.
#cm = plt.cm.get_cmap('RdYlBu_r')
#z = np.random.random((len(ra), 1))  # RGB values
#SC = ax.scatter(ra, dec, marker='o', c=z, s=10, lw=0., cmap=cm)
# Colorbar
#cbar = plt.colorbar(SC, shrink=1., pad=0.05)
#cbar.ax.tick_params(labelsize=8)
#cbar.set_label('colorbar', fontsize=8)

# Output png file.
fig.tight_layout()
plt.savefig(ra_dec_plot.png', dpi=300)

person Gabriel    schedule 08.04.2015    source источник
comment
если вам нужен первый график, то это не полярный график, а стандартный декартовый график, который можно воспроизвести, построив все линии сетки вручную   -  person Julien Spronck    schedule 09.04.2015
comment
Снова привет, Жюльен :) Это не декартов график, поскольку линии равных значений изогнуты, а не прямые. Вы это имели в виду?   -  person Gabriel    schedule 09.04.2015
comment
Привет обратно :) я имел в виду, что это можно сделать, используя стандартные оси вместо полярных осей. Вы можете рассчитать координаты x, y кривых, составляющих сетку, и нанести их на стандартные оси. Возможно, вы не захотите этого делать, потому что это громоздко, но именно так выглядит первый сюжет.   -  person Julien Spronck    schedule 09.04.2015
comment
Что касается цветовой карты, разве вы не можете использовать тот же самый трюк, который я дал вам в предыдущем вопросе => использовать AxesDivider?   -  person Julien Spronck    schedule 09.04.2015
comment
Первый график представляет собой прямоугольный участок полярного графика. Все линии с константой тета проходят через полярное начало координат, в отличие от только одной из линий с константой x и константы y, которые пересекают декартово начало координат. Итак, три проблемы: перемаркировка того, что обычно theta, в часы (есть ли для этого простой расчет, Габриэль?), отсечение до прямоугольника и цветовая полоса.   -  person cphlewis    schedule 09.04.2015
comment
@JulienSpronck Я посмотрю, как рассматривать это как декартов график, выполняя необходимые преобразования для построения сетки. Что касается цветовой карты, если вы проверите MWE, вы увидите, что трюк с цветовой полосой, который вы мне дали, закомментирован. Если я использую его, я получаю испорченный сюжет, который я показываю последним в посте.   -  person Gabriel    schedule 09.04.2015
comment
@cphlewis видит обновленный вопрос о том, как преобразовать степени в h:m:s и d:m:s.   -  person Gabriel    schedule 09.04.2015
comment
ваша ось Y линейна? Этого нет на первом графике, который вы показываете (расстояние между -80 и -70 отличается от -70 до -60 из-за сферической проекции   -  person Julien Spronck    schedule 09.04.2015
comment
А, связанное решение об отсечении полярных графиков полезно — встроенный полярный график сделал достаточно вариантов по умолчанию, поэтому они рекомендуют сделать собственного исполнителя. Хм.   -  person cphlewis    schedule 09.04.2015
comment
@JulienSpronck это не так, ось Y указана в градусах:минутах:секундах (координаты склонения).   -  person Gabriel    schedule 09.04.2015
comment
может быть еще одной причиной для стандартного графика по сравнению с полярным (поскольку ваша сетка все равно должна быть рассчитана)   -  person Julien Spronck    schedule 09.04.2015
comment
В каких единицах вы на самом деле получаете данные? так или иначе, вы определяете преобразование, может также заставить его выполнять преобразования единиц измерения по умолчанию. -- Наименее стандартная вещь в этом, пожалуй, это метки прямого восхождения, продолжающиеся до верхней границы.   -  person cphlewis    schedule 09.04.2015
comment
@cphlewis Я получаю данные в десятичных градусах, но с помощью astropy я могу преобразовать их в любые необходимые единицы (например, d:m:s, радианы). Проблема заключается в создании чего-то похожего на первый сюжет. Возможно, лучше всего перейти к линейным координатам и рассчитать, как создать кривую сетку для склонения и радиальные линии для прямого восхождения.   -  person Gabriel    schedule 09.04.2015
comment
Я совершенно уверен, что это проще всего делать постепенно — я уверен, потому что я дважды начал работать с пользовательскими преобразованиями и в итоге отправил что-то поддельное на линейный график, потому что я мог это сделать. Преобразования красивы и просты в теории и сбивают меня с толку на практике. (Можно упомянуть эту проблему в чате по Python — когда им нравится проблема, она РЕШАЕТСЯ.)   -  person cphlewis    schedule 09.04.2015
comment
Ого! Посмотрите пример криволинейной сетки в AxisArtist: matplotlib.org/mpl_toolkits/axes_grid /users/ Это прямолинейное окно на полярной сетке, и деления на внешнем прямоугольнике расположены неравномерно (поскольку они находятся на четных расстояниях тета).   -  person cphlewis    schedule 09.04.2015
comment
Это выглядит очень многообещающе, спасибо @cphlewis! Я посмотрю его завтра утром (сейчас здесь очень поздно) и отпишусь здесь, как только смогу.   -  person Gabriel    schedule 09.04.2015
comment
В важных вещах я бы ссылался на оси theta и r. В остальном, мне кажется, все ясно. Если баунти этого не делает, попробуйте связаться с автором AxisArtist?   -  person cphlewis    schedule 13.04.2015
comment
@cphlewis нравится это? Сейчас я оставлю сообщение в чате Python, чтобы узнать, может ли кто-нибудь пролить свет на это.   -  person Gabriel    schedule 13.04.2015


Ответы (3)


Получить цветовую полосу можно путем слияния кода OP с отличным ответом @cphlewis. Я разместил это как готовое решение по запросу OP в чате. Первая версия кода просто добавляет цветную полосу, окончательная версия (под EDIT 2) выполняет аффинное преобразование осей и исправляет несколько параметров / упрощает код, чтобы точно соответствовать спецификации OP.

"""
An experimental support for curvilinear grid.
"""
import numpy as np
import  mpl_toolkits.axisartist.angle_helper as angle_helper
import matplotlib.cm as cmap
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D

from mpl_toolkits.axisartist import SubplotHost

from mpl_toolkits.axisartist import GridHelperCurveLinear


def curvelinear_test2(fig):
    """
    polar projection, but in a rectangular box.
    """
    global ax1

    # see demo_curvelinear_grid.py for details
    tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()

    extreme_finder = angle_helper.ExtremeFinderCycle(10, 60,
                                                     lon_cycle = 360,
                                                     lat_cycle = None,
                                                     lon_minmax = None,
                                                     lat_minmax = (0, np.inf),
                                                     )

    grid_locator1 = angle_helper.LocatorHMS(12) #changes theta gridline count
    tick_formatter1 = angle_helper.FormatterHMS()

    grid_locator2 = angle_helper.LocatorDMS(6)
    tick_formatter2 = angle_helper.FormatterDMS()

    grid_helper = GridHelperCurveLinear(tr,
                                        extreme_finder=extreme_finder,
                                        grid_locator1=grid_locator1,
                                        tick_formatter1=tick_formatter1,
                                        grid_locator2=grid_locator2,
                                        tick_formatter2=tick_formatter2
                                        )


    ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)

    # make ticklabels of right and top axis visible.
    ax1.axis["right"].major_ticklabels.set_visible(True)
    ax1.axis["top"].major_ticklabels.set_visible(True)
    ax1.axis["bottom"].major_ticklabels.set_visible(True) #Turn off? 
    # let right and bottom axis show ticklabels for 1st coordinate (angle)
    ax1.axis["right"].get_helper().nth_coord_ticks=0
    ax1.axis["bottom"].get_helper().nth_coord_ticks=0



    fig.add_subplot(ax1)

    grid_helper = ax1.get_grid_helper()

    ax1.set_aspect(1.)
    ax1.set_xlim(-4,15) # moves the origin left-right in ax1
    ax1.set_ylim(-3, 20) # moves the origin up-down

    ax1.set_ylabel('90$^\circ$ + Declination')
    ax1.set_xlabel('Ascension')
    ax1.grid(True)
    #ax1.grid(linestyle='--', which='x') # either keyword applies to both
    #ax1.grid(linestyle=':', which='y')  # sets of gridlines

    return tr

import matplotlib.pyplot as plt
fig = plt.figure(1, figsize=(5, 5))
fig.clf()

tr = curvelinear_test2(fig) # tr.transform_point((x, 0)) is always (0,0)
                            # => (theta, r) in but (r, theta) out...
r_test =   [0, 1.2, 2.8, 3.8, 5,  8,  10, 13.3, 17]  # distance from origin
deg_test = [0,  -7, 12,  28,  45, 70, 79, 90,   100] # degrees ascension
out_test = tr.transform(zip(deg_test, r_test))

sizes = [40, 30, 10, 30, 80, 33, 12, 48, 45]
#hues = [.9, .3, .2, .8, .6, .1, .4, .5,.7] # Oddly, floats-to-colormap worked for a while.
hues = np.random.random((9,3)) #RGB values

# Use this block to generate colored points with a colorbar.
cm = plt.cm.get_cmap('RdYlBu_r')
z = np.random.random((len(r_test), 1))  # RGB values

SC = ax1.scatter(out_test[:,0], #ax1 is a global
            out_test[:,1],
            s=sizes,
            c=z,
            cmap=cm,
            zorder=9) #on top of gridlines
            
# Colorbar
cbar = plt.colorbar(SC, shrink=1., pad=0.05)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('colorbar', fontsize=8)


plt.show()

ИЗМЕНИТЬ

Немного очистки параметров, добавление данных OP, удаление избыточности дает следующий график. Все еще нужно центрировать данные на -90 вместо 0 - на данный момент это взломано, но я уверен, что curvelinear_test2() можно изменить, чтобы учесть это...

Изображение, соответствующее желаемому формату OP

ИЗМЕНИТЬ 2

После комментария OP к промежуточной версии в этом ответе окончательная версия, как показано ниже, дает сюжет в самом конце поста - с -90 на оси dec и демонстрацией подзаголовка.

"""
An experimental support for curvilinear grid.
"""
import numpy as np
import  mpl_toolkits.axisartist.angle_helper as angle_helper
import matplotlib.cm as cmap
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D

from mpl_toolkits.axisartist import SubplotHost

from mpl_toolkits.axisartist import GridHelperCurveLinear


def curvelinear_test2(fig, rect=111):
    """
    polar projection, but in a rectangular box.
    """

    # see demo_curvelinear_grid.py for details
    tr = Affine2D().translate(0,90) + Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()

    extreme_finder = angle_helper.ExtremeFinderCycle(10, 60,
                                                     lon_cycle = 360,
                                                     lat_cycle = None,
                                                     lon_minmax = None,
                                                     lat_minmax = (-90, np.inf),
                                                     )

    grid_locator1 = angle_helper.LocatorHMS(12) #changes theta gridline count
    tick_formatter1 = angle_helper.FormatterHMS()

    grid_helper = GridHelperCurveLinear(tr,
                                        extreme_finder=extreme_finder,
                                        grid_locator1=grid_locator1,
                                        tick_formatter1=tick_formatter1
                                        )


    ax1 = SubplotHost(fig, rect, grid_helper=grid_helper)

    # make ticklabels of right and top axis visible.
    ax1.axis["right"].major_ticklabels.set_visible(True)
    ax1.axis["top"].major_ticklabels.set_visible(True)
    ax1.axis["bottom"].major_ticklabels.set_visible(True) #Turn off? 
    # let right and bottom axis show ticklabels for 1st coordinate (angle)
    ax1.axis["right"].get_helper().nth_coord_ticks=0
    ax1.axis["bottom"].get_helper().nth_coord_ticks=0



    fig.add_subplot(ax1)

    grid_helper = ax1.get_grid_helper()

    # You may or may not need these - they set the view window explicitly rather than using the
    # default as determined by matplotlib with extreme finder.
    ax1.set_aspect(1.)
    ax1.set_xlim(-4,25) # moves the origin left-right in ax1
    ax1.set_ylim(-3, 30) # moves the origin up-down

    ax1.set_ylabel('Declination')
    ax1.set_xlabel('Ascension')
    ax1.grid(True)
    #ax1.grid(linestyle='--', which='x') # either keyword applies to both
    #ax1.grid(linestyle=':', which='y')  # sets of gridlines

    return ax1,tr
    
    
def skip_comments(f):
    '''
    Read lines that DO NOT start with a # symbol.
    '''
    for line in f:
        if not line.strip().startswith('#'):
            yield line
            
def get_data_bb():
    '''RA, DEC data file.
    '''

    # Path to data file.
    out_file = 'bb_cat.dat'

    # Read data file
    with open(out_file) as f:
        ra, dec = [], []

        for line in skip_comments(f):
            ra.append(float(line.split()[0]))
            dec.append(float(line.split()[1]))

    return ra, dec


import matplotlib.pyplot as plt
fig = plt.figure(1, figsize=(5, 5))
fig.clf()

ax1, tr = curvelinear_test2(fig,121) # tr.transform_point((x, 0)) is always (0,0)
                            # => (theta, r) in but (r, theta) out...             

# Read RA, DEC data from file.
ra, dec = get_data_bb()
out_test = tr.transform(zip(ra, dec))

# Use this block to generate colored points with a colorbar.
cm = plt.cm.get_cmap('RdYlBu_r')
z = np.random.random((len(ra), 1))  # RGB values

SC = ax1.scatter(out_test[:,0], #ax1 is a global
            out_test[:,1],
            marker = 'o',
            c=z,
            cmap=cm,
            lw = 0.,
            zorder=9) #on top of gridlines
            
# Colorbar
cbar = plt.colorbar(SC, shrink=1., pad=0.1)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('colorbar', fontsize=8)

ax2, tr = curvelinear_test2(fig,122) # tr.transform_point((x, 0)) is always (0,0)
                            # => (theta, r) in but (r, theta) out...             

# Read RA, DEC data from file.
ra, dec = get_data_bb()
out_test = tr.transform(zip(ra, dec))

# Use this block to generate colored points with a colorbar.
cm = plt.cm.get_cmap('RdYlBu_r')
z = np.random.random((len(ra), 1))  # RGB values

SC = ax2.scatter(out_test[:,0], #ax1 is a global
            out_test[:,1],
            marker = 'o',
            c=z,
            cmap=cm,
            lw = 0.,
            zorder=9) #on top of gridlines
            
# Colorbar
cbar = plt.colorbar(SC, shrink=1., pad=0.1)
cbar.ax.tick_params(labelsize=8)
cbar.set_label('colorbar', fontsize=8)

plt.show()

Финальный сюжет:

Изображение, показывающее правильный сюжет

person J Richard Snape    schedule 13.04.2015
comment
Так близко! Я вижу, что отсутствуют только две (незначительные) вещи: 1- поиск подзаголовка с использованием gridspec. Мне это нужно, потому что мне нужно создать несколько таких графиков в файле изображения рядом друг с другом. 2- Ось Y (склонение) должна показывать значения -80, -70, -60. Если вам удастся это сделать, я отмечу ваш ответ как принятый (и, надеюсь, я смогу дать вам и cphlewis по 50 баллов). - person Gabriel; 13.04.2015
comment
Сделал это сейчас. Я надеюсь, вы сможете увидеть, как манипулировать графиками, как вы хотите, из примера подзаговора и комментариев в функции. Они могли бы использовать некоторое переименование, потенциально, чтобы их можно было легко использовать повторно... - person J Richard Snape; 13.04.2015
comment
Отличный ответ. Дж. Ричард, вы действительно очень мне помогли. Я добавил строку tick_formatter2 = angle_helper.FormatterDMS() перед определением grid_helper и tick_formatter2=tick_formatter2 внутри нее, чтобы градусы по оси Y отображались с правильным символом º (градус). Мне просто нужно выяснить, как заставить его отображаться без десятичных знаков (например: 80º вместо 80.0º ), но это очень незначительная настройка. Я отмечаю это как принятый ответ и посмотрю, смогу ли я дать вам обоим обещанные 50 баллов. Спасибо вам большое еще раз! - person Gabriel; 13.04.2015
comment
Хорошо, удалось решить проблему 80.0º, добавив строку grid_locator2 = angle_helper.LocatorDMS(6) перед grid_helper и строку grid_locator2=grid_locator2 внутри нее. - person Gabriel; 13.04.2015
comment
ОК - я подумал, что это лишнее, поэтому удалил его из исходной версии cphlewis - извините за это :( Рад, что вы смогли вернуть его так, как хотели. - person J Richard Snape; 13.04.2015

Жевать пример AxisArtist на самом деле довольно многообещающе (он объединяет два примера AxisArtist — я не удивлюсь, если AxisArtist был написан с учетом графиков RA):

введите здесь описание изображения

Еще предстоит сделать:

  1. Склонение должно варьироваться от -90 в начале координат до 0.
  2. Уметь использовать и добавлять цветную полосу
  3. отрегулируйте пределы, если рисуете за их пределами

эстетический:

  1. Шрифт с засечками в метках осей
  2. Пунктирные линии сетки для восхождения

что-нибудь еще?

"""
An experimental support for curvilinear grid.
"""
import numpy as np
import  mpl_toolkits.axisartist.angle_helper as angle_helper
import matplotlib.cm as cmap
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D

from mpl_toolkits.axisartist import SubplotHost

from mpl_toolkits.axisartist import GridHelperCurveLinear


def curvelinear_test2(fig):
    """
    polar projection, but in a rectangular box.
    """
    global ax1

    # see demo_curvelinear_grid.py for details
    tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform()

    extreme_finder = angle_helper.ExtremeFinderCycle(10, 60,
                                                     lon_cycle = 360,
                                                     lat_cycle = None,
                                                     lon_minmax = None,
                                                     lat_minmax = (0, np.inf),
                                                     )

    grid_locator1 = angle_helper.LocatorHMS(12) #changes theta gridline count
    tick_formatter1 = angle_helper.FormatterHMS()

    grid_locator2 = angle_helper.LocatorDMS(6)
    tick_formatter2 = angle_helper.FormatterDMS()

    grid_helper = GridHelperCurveLinear(tr,
                                        extreme_finder=extreme_finder,
                                        grid_locator1=grid_locator1,
                                        tick_formatter1=tick_formatter1,
                                        grid_locator2=grid_locator2,
                                        tick_formatter2=tick_formatter2
                                        )


    ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)

    # make ticklabels of right and top axis visible.
    ax1.axis["right"].major_ticklabels.set_visible(True)
    ax1.axis["top"].major_ticklabels.set_visible(True)
    ax1.axis["bottom"].major_ticklabels.set_visible(True) #Turn off? 
    # let right and bottom axis show ticklabels for 1st coordinate (angle)
    ax1.axis["right"].get_helper().nth_coord_ticks=0
    ax1.axis["bottom"].get_helper().nth_coord_ticks=0



    fig.add_subplot(ax1)

    grid_helper = ax1.get_grid_helper()

    ax1.set_aspect(1.)
    ax1.set_xlim(-4,15) # moves the origin left-right in ax1
    ax1.set_ylim(-3, 20) # moves the origin up-down

    ax1.set_ylabel('90$^\circ$ + Declination')
    ax1.set_xlabel('Ascension')
    ax1.grid(True)
    #ax1.grid(linestyle='--', which='x') # either keyword applies to both
    #ax1.grid(linestyle=':', which='y')  # sets of gridlines

    return tr

import matplotlib.pyplot as plt
fig = plt.figure(1, figsize=(5, 5))
fig.clf()

tr = curvelinear_test2(fig) # tr.transform_point((x, 0)) is always (0,0)
                            # => (theta, r) in but (r, theta) out...
r_test =   [0, 1.2, 2.8, 3.8, 5,  8,  10, 13.3, 17]  # distance from origin
deg_test = [0,  -7, 12,  28,  45, 70, 79, 90,   100] # degrees ascension
out_test = tr.transform(zip(deg_test, r_test))

sizes = [40, 30, 10, 30, 80, 33, 12, 48, 45]
#hues = [.9, .3, .2, .8, .6, .1, .4, .5,.7] # Oddly, floats-to-colormap worked for a while.
hues = np.random.random((9,3)) #RGB values

ax1.scatter(out_test[:,0], #ax1 is a global
            out_test[:,1],
            s=sizes,
            c=hues,
            #cmap=cmap.RdYlBu_r,
            zorder=9) #on top of gridlines


plt.show()
person cphlewis    schedule 10.04.2015
comment
Благодарим Вас за оценку Этот ответ выглядит очень красиво, но меня беспокоят две вещи: 1- я теряю цветовую полосу, и она мне действительно нужна (пытался добавить ее обратно, но все время получаю TypeError: You must first set_array for mappable). 2- Расположение оси склонения сбивает с толку. Например, если я попытаюсь нанести точку с координатами: (ra=11.76, dec=-73.5) (которую я ввожу как: r_test = [11.76], deg_test = [-73.5]), я получу i.imgur.com/r8Mwvag.png. Если я инвертирую значения в r_test, deg_test, то tr.transform возвращает nan. Я явно что-то здесь упускаю. - person Gabriel; 10.04.2015
comment
Похоже, мне нужно инвертировать значения склонения, а затем обработать их как: tr.transform(zip(ra, inv_dec)), где ra — прямое восхождение, а inv_dec — инвертированное (то есть: * -1) склонение, оба изначально в десятичных градусах. - person Gabriel; 10.04.2015
comment
Мне пришлось поиграть с tr([(0,1), (0,10), (10,0), (1, 0)]), чтобы быть уверенным в том, какая ось получила какую часть кортежа. По-видимому, tr меняет порядок, а также выполняет триггер. Ооооооооооооооооооооооо И я так и не понял, как перевернуть ось Dec или даже изменить метки ее осей, и получил различные ошибки при попытке добавить цветовую полосу. (Что можно сделать неэлегантно — получить значения RGB из сопоставления цветов, нарисовать цветовую полосу независимо от этого AxisArtist.) - person cphlewis; 10.04.2015
comment
Но! На самом деле, я подозреваю, что кто-то, разрабатывавший это, делал эти графики, и также это кажется достаточно интересным, что энтузиасты чата Python могут быть заинтересованы в создании реального класса графиков RA-Dec. Не могли бы вы преобразовать оригинал в более простой набор примеров To-Do и Part-Done? Включая образец входных данных и выходного изображения, даже если вам нужно нарисовать разброс на бумаге и сделать снимок телефона? - person cphlewis; 10.04.2015
comment
Хорошо, я перепишу вопрос завтра утром, чтобы быть максимально ясным. Спасибо за помощь cphlewis! - person Gabriel; 11.04.2015
comment
Я переписал ответ, чтобы предоставить больше деталей и лучше объяснить изображения. Дайте мне знать, что вы думаете о cphlewis. - person Gabriel; 12.04.2015
comment
cphlewis: 100 баллов тебе, мой друг. Большое спасибо за вашу помощь! - person Gabriel; 15.04.2015

Я думаю, что это может быть проблема с Python 3+, теперь строка

out_test = tr.transform(zip(deg_test, r_test))

возвращает ошибку:

ValueError: невозможно преобразовать массив размера 1 в форму (2)

Меняем строку на

out_test = tr.transform(list(zip(deg_test, r_test)))

устраняет проблему и позволяет правильно построить график.

person Bob Anderson    schedule 27.03.2021