Напишите две или три метки по тикам, показывая час в UT и MLT (магнитное местное время), используя matplotlib - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь сделать этот сюжет, похожий на пример рисунка. Я также приложил пример данных.

Пример данных

Я хочу построить один столбец (BLC 73.61, FCC 68.5, BSL 40.69) в зависимости от времени, которые находятся в индексе фрейма данных, и вместе с метками даты и времени и хочу показать соответствующий MLT (Магнитное местное время) значение, которое находится в четвертом столбце базы данных.

Вот код, который я пытаюсь сделать:

На рисунке показан пример того, что я хочу сделать. Этикетки с метками x показывают в одной строке значение uT часа в формате datetime, а во второй или третьей строке - соответствующее значение MLT

.
# read the data
data = pd.read_csv('dados.csv', index_col=[0])

#plotting 
fig = plt.figure(figsize=(10, 5)) #
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny() # second x-axis
ax1.plot(data.index,data['BLC 73.61'])
ax2.xaxis.set_ticks_position("bottom")
ax2.xaxis.set_label_position("bottom")
ax2.spines["bottom"].set_position(("axes", -0.2))
ax2.spines['bottom'].set_color('none')

majorLocator   = MultipleLocator(1)
minorLocator   = MultipleLocator(1)
ax1.xaxis.set_major_locator(majorLocator)
ax1.xaxis.set_minor_locator(minorLocator)
ax1.xaxis.set_major_locator(majorLocator)
ax1.xaxis.set_minor_locator(minorLocator)
ax1.xaxis.set_minor_formatter(dates.DateFormatter('%H:%M'))
ax1.xaxis.set_minor_locator(mdates.MinuteLocator(interval=30))
ax1.xaxis.set_major_formatter(dates.DateFormatter('%H:%M\n%b %d, %Y'))
ax1.xaxis.set_major_locator(mdates.HourLocator(interval=30))

ax2.set_xticklabels(data['MLT'].values)

# ax2.xaxis.set_minor_formatter(dates.DateFormatter('%H:%M'))
# ax2.xaxis.set_minor_locator(mdates.MinuteLocator(interval=30))
# ax2.xaxis.set_major_formatter(dates.DateFormatter('%H:%M\n%b %d, %Y'))
# ax2.xaxis.set_major_locator(mdates.HourLocator(interval=30))
a=ax2.get_xticks().tolist()

И вот что я получаю в результате:

Результат

1 Ответ

0 голосов
/ 06 ноября 2018

Я только что нашел одно решение для этого.

Я создал функцию, определяющую, как я хочу галочки, и использовал модуль FuncFormatter.

def format_func(value, tick_number):

    hora = mdates.num2date(value)
    teste = mlt['BLC 73.61'][hora]
    return ('%d:%d \n %0.1f'  % (hora.hour, hora.minute,teste))

def format_func2(value, tick_number):
    # find the first value
    if tick_number == 0:
        return ('hh:mm     \n MLT     ')
    else:
        return (' ')

Сначала преобразуйте значения меток времени в числа:

xx = [mdates.date2num(i) for i in ada[ini:end].index]

и сюжет

fig = plt.figure(figsize=(10, 5)) #
ax1 = fig.add_subplot(111)
ax1.plot(xx,ada['BLC 73.61'][ini:end])
# set the major locator ion the month values
ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=5))
# use the format difeined in format_func2
ax1.xaxis.set_major_formatter(plt.FuncFormatter(format_func2))
ax1.xaxis.set_minor_locator(mdates.HourLocator(interval=2)) 
ax1.xaxis.set_minor_formatter(plt.FuncFormatter(format_func))
...