python: построение вертикальной полосы с использованием matplotlib для оси, на которой отображено время
Подскажите как отрисовать вертикальную полосу с использованием matplotlib, при условии, что ось x задаёт время
Для отображения полосы использую метод axvspan
Вот весь код:
Изначально ось x содержит timestamp (секунды с эры UNIX)
import datetime
import pytz
import math
import pathlib
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# считать данные из файла (в виде Numpy массива)
def loadDataFromFile(path):
with open(path) as file:
data = [line[:-1].split(';') for line in file]
return np.array(data, dtype=object)
# инициализировать отрисовку графики
def initializeRender(width = 1280, height = 1024):
px = 1 / plt.rcParams['figure.dpi']
fig, ax = plt.subplots(figsize=(width * px, height * px))
return (fig, ax)
# завершить отрисовку графики
def releaseRender(path):
fig.savefig(path)
# plt.show()
plt.clf()
plt.close("all")
# считать данные из файла
src_data = loadDataFromFile(file_path)
x = np.array(src_data[:, 0], float)
y = np.array(src_data[:, 1], float)
# преобразовать данные
dates = [datetime.datetime.fromtimestamp(ts, pytz.timezone('Europe/Moscow')) for ts in x]
datenums = matplotlib.dates.date2num(dates)
# построить график
fig, ax = initializeRender(1280, 1024)
xfmt = matplotlib.dates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(xfmt)
ax.xaxis.set_major_locator(matplotlib.dates.HourLocator(interval=2))
plt.grid(color='#d0d0d0', linestyle='--', linewidth=0.5)
ax.plot(datenums, y)
# отрисовать полосу
x_l = matplotlib.dates.date2num([datetime.datetime.fromtimestamp(ts, pytz.timezone('Europe/Moscow')) for ts in [x.max() / 2, x.max() / 2 + 3600]])
ax.axvspan(x_l[0], x_l[1], alpha=0.5, color='red')
releaseRender(graph_path)
График строится замечательно, но когда добавляют код для постройки полосы, то получаю
Locator attempting to generate 123829 ticks ([8912.0, ..., 19231.0]), which exceeds Locator.MAXTICKS (1000).
похоже, что полоса уезжает далеко направо (в графике время условно сутки от вчера до сегодня)
Подскажите, в чем может быть проблема?
Ответы (1 шт):
разобрался с вопросом - код правильный, все дело в том, что для теста я хотел построить полосу по центру, а для этого надо было сделать (x.max() + x.min()) / 2 а не x.max() / 2, в результате действительно данные уползали куда-то в прошлый век :)