Подтвердить что ты не робот

Matplotlib интеллектуальные метки оси для timedelta

У меня есть простой набор данных значений X и Y, которые я рисую в matplotlib. Независимой переменной в моих данных является продолжительность /timedelta (например, 60 секунд, 2 часа, 24 часа, 10 дней), которые в моих входных данных всегда представлены как целое число секунд. Мой вопрос в том, имеет ли matplotlib какой-либо способ интеллектуального определения меток оси длительности в форме, удобочитаемой человеком?

Например, на маленьком конце шкалы было бы желательно показать 30 секунд просто как "30 секунд". На большом конце шкалы было бы лучше показать "10 дней", а не 864000 секунд. Где-то между ними было бы лучше, если бы эти ярлыки читались в "минутах" и "часах". Имеет ли matplotlib какой-либо автоматизированный способ вывести что-то приблизительно человеческое, читаемое для длительностей, охватывающих несколько порядков?

В идеале, любой подход, который я использую, должен обобщать на наборы данных, которые охватывают разные временные рамки, а не график, который индивидуально адаптирован к одному входному набору данных.

4b9b3361

Ответ 1

Не могли бы вы привести пример? Это то, что вы хотите:

import datetime                                                                                                                                                                                                                                                                

import numpy as np                                                                                                                                                                                                                                                             
import pylab as plt                                                                                                                                                                                                                                                            
import matplotlib                                                                                                                                                                                                                                                              

fig = plt.figure()                                                                                                                                                                                                                                                             
ax = fig.add_subplot(111)                                                                                                                                                                                                                                                      

x = np.linspace(0, 300)  # 5 minutes                                                                                                                                                                                                                                                      
y = np.random.random(len(x))                                                                                                                                                                                                                                                   

ax.plot(x, y)                                                                                                                                                                                                                                                                  

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

plt.show()

Example output

Он использует питоны timedelta. С 864000 секундами вышесказанное приведет к "10 дням, 10:00:00". Конечно, вы можете использовать более продвинутое форматирование в функции timeTicks() выше.