matplotlib:具有良好动态格式的绘图持续时间

时间:2011-07-09 20:26:22

标签: python matplotlib

我需要制作一个日期(在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 :(得分:0)

您可以根据ylim注册一个与y数据相混淆的事件处理程序。

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)

答案 1 :(得分:0)

我这样做的方法是使用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)应用于轴,这将在用户缩放时缩放。请注意,这并不能解决大多数问题,但在类似情况下可能对其他人有用。