matplotlib: длительность сюжета с хорошим и динамическим форматированием - PullRequest
1 голос
/ 10 июля 2011

Мне нужно сделать графики даты (на x) и продолжительности времени (на y), и мне нужно иметь умное форматирование для оси y.Мои данные имеют формат: «0: 00: 02.994000» (0 часов, 0 минут, 2 секунды и 994000 микросекунд).

Данные могут варьироваться от нескольких секунд до более 12 часовЯ бы предположил, хотя, как правило, для любого заданного графика большинство точек данных будут в одних и тех же единицах (секундах, минутах или часах).

Проблема в том, что иногда могут быть выбросы, которые находятся в другой единице.Например, может быть сюжет, в котором большинство продолжительности находятся в пределах 1-3 часов, но время от времени существует точка данных, равная 5 минутам или даже 30 секундам.Или это может быть другой, в основном с точками данных в минутах, но иногда длинный или короткий в часах или секундах.

Я хочу выбрать хороший (динамический) способ форматирования оси y.Есть две проблемы:

1) Должен ли я проанализировать данные, чтобы увидеть, в каких единицах находится большинство точек данных, а затем использовать их в качестве единиц оси y?То есть, если большинство длительностей минут, то ось y должна быть указана в минутах.Если большинство выражено в часах, то по оси y должны быть часы и т. Д. Таким образом, форматирование наиболее подходит для типа отображаемых данных.

2) Если в графике указаны единицы измерения y в виде минут(из-за точки # 1), но пользователь хочет увеличить (с помощью инструмента масштабирования) точку данных, которая занимает всего несколько секунд, я бы хотел, чтобы средство форматирования изменило масштаб по y на несколько секунд.Я не хочу, чтобы значения длительности на оси Y были такими, как «0,0335» минуты, а скорее «2 секунды».

Буду признателен за любые предложения о том, как подойти к этому.Спасибо, че

Ответы [ 2 ]

0 голосов
/ 31 марта 2013

Я делаю это, используя форматирование строки datetime.timedelta, вы можете создать форматер следующим образом:

def timeTicks(x, pos):
    d = datetime.timedelta(seconds=x)
    return str(d)
formatter = matplotlib.ticker.FuncFormatter(timeTicks)

Который можно применить к оси, используя ax.xaxis.set_major_formatter(formatter), он будет масштабироваться, когда пользователь увеличивает масштаб. Обратите внимание, что это не решает проблему большинства, но может быть полезно для других в подобных ситуациях.

0 голосов
/ 10 июля 2011

Вы можете зарегистрировать обработчик событий, который отбрасывает данные y на основе ylim.

fig = plt.figure()
ax = fig.add_subplot(111)
ylim = ax.get_ylim()
scale = get_scale(ylim)
def tweak_y(event):
    new_ylim = ax.get_ylim() 
    if new_ylim == ylim:
        return
    ylim = new_ylim
    if get_scale(ylim) != scale:
        # tweak ydata and replot
        pass

cid = fig.canvas.mpl_connect('draw_event', tweak_y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...