matplotlib智能轴标签用于timedelta。

19
我有一个简单的数据集,其中包含X和Y值,我正在matplotlib中绘制它。我的数据中独立变量是持续时间/时间差(例如60秒、2小时、24小时、10天),在我的输入数据中始终表示为整数秒数。我的问题是,matplotlib是否有任何智能设置持续时间轴标签的方法,以便以人类可读的形式显示?
例如,在小尺度上,仅将30秒显示为“30秒”是可取的。在大尺度上,最好显示“10天”,而不是864000秒。在中间某个位置,最好使用“分钟”和“小时”来读取标签。Matplotlib是否有自动推断跨越几个数量级的持续时间的近似人类可读性的方法?
理想情况下,我使用的任何方法都应该适用于跨越不同持续时间尺度的数据集,而不是针对一个输入数据集进行个别定制的图表。
1个回答

19

你能提供一个例子吗?这是你想要的吗:

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

示例输出

它使用Python的timedelta。使用864000秒,上面的代码将得到“10天10:00:00”的结果。当然,你可以在上面的timeTicks()函数中添加更高级的格式化。


1
此外,如果您想修改xticks以每分钟显示一次:ax.xaxis.set_major_locator(plt.MultipleLocator(1*60)) - eldad-a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接