Напишите две или три метки по тикам, показывая час в UT и MLT (местное магнитное время), используя matplotlib
Я пытаюсь сделать этот сюжет, похожий на пример рисунка. Я также приложил пример данных.
Я хочу построить один столбец (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 ответ
Я только что нашел одно решение для этого.
Я создал функцию, определяющую, как я хочу галочки, и использовал модуль 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))