16

我在 matplotlib 中绘制了一个简单的 X 和 Y 值数据集。我的数据中的自变量是持续时间/时间增量(例如 60 秒、2 小时、24 小时、10 天),在我的输入数据中始终表示为整数秒数。我的问题是,matplotlib 有没有办法以人类可读的形式智能地设置持续时间轴标签?

例如,在规模较小的一端,最好将 30 秒简单地显示为“30 秒”。在规模较大的一端,显示“10 天”而不是 864000 秒会更好。介于两者之间的某个地方,最好以“分钟”和“小时”为单位读取标签。matplotlib 是否有任何自动方式来推断在跨越几个数量级的持续时间内近似人类可读的东西?

理想情况下,我使用的任何方法都应该推广到跨越不同持续时间尺度的数据集,而不是针对一个输入数据集单独定制的图。

4

1 回答 1

17

你能举个例子吗?这是你想要的吗:

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()

示例输出

它使用pythons timedelta。864000 秒以上将导致“10 天,10:00:00”。您当然可以将更高级的格式填充到上面的timeTicks()函数中。

于 2013-07-24T12:38:37.297 回答