Принудительное отображение тиков в определенные даты при использовании plot_date - PullRequest
0 голосов
/ 19 декабря 2018

Этот код даст следующий рисунок:

import math
import matplotlib.pyplot as plt
from matplotlib.dates import (YEARLY,HOURLY, DateFormatter,
                              drange)
import datetime


date1 = datetime.datetime(1952, 1, 1, 1, 1, 1)
date2 = datetime.datetime(1952, 1, 1, 23, 59, 59)
delta = datetime.timedelta(minutes= 10)

dates = drange(date1, date2, delta)
y = [math.sin(x/10.0) for x,_ in enumerate(dates)]

fig, ax = plt.subplots()

plt.plot_date(dates, y)

plt.plot_date([dates[15],dates[121]], [y[15], y[121]], marker="*", c="yellow", markersize=20)

ax.xaxis.set_major_formatter(DateFormatter('%H:%M:%S'))
ax.xaxis.set_tick_params(rotation=45, labelsize=10)

fig.autofmt_xdate()

plt.show()

enter image description here

Я хочу указать, когда произошли два события, отмеченные звездочкой.

Как заставить пиплот рисовать галочку под местоположениями двух звезд?

Я понял, что мне нужно использовать пользовательский локатор.А как именно?Похоже, что он будет производить только равномерно распределенную линейку.

rule = rrulewrapper(???)  
loc = RRuleLocator(rule)

1 Ответ

0 голосов
/ 19 декабря 2018

Если у вас есть определенное местоположение галочек, вы можете использовать FixedLocator.

import math
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, drange
from matplotlib.ticker import FixedLocator
import datetime


date1 = datetime.datetime(1952, 1, 1, 1, 1, 1)
date2 = datetime.datetime(1952, 1, 1, 23, 59, 59)
delta = datetime.timedelta(minutes= 10)

dates = drange(date1, date2, delta)
y = [math.sin(x/10.0) for x,_ in enumerate(dates)]

fig, ax = plt.subplots()

plt.plot_date(dates, y)

events, = plt.plot_date([dates[15],dates[121]], [y[15], y[121]], 
                   marker="*", c="r", markersize=20, ls="")

ax.xaxis.set_major_formatter(DateFormatter('%H:%M:%S'))
ax.xaxis.set_tick_params(which="major", rotation=30, labelsize=9)

ax.xaxis.set_minor_locator(FixedLocator(events.get_xdata()))
ax.xaxis.set_minor_formatter(DateFormatter('%H:%M:%S'))
ax.xaxis.set_tick_params(which="minor", rotation=30, labelsize=10, labelcolor="r")

plt.setp(ax.get_xticklabels(which="both"), ha="right")
plt.show()

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...