我需要制作一个日期(在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秒”。
如何处理此问题的任何建议将不胜感激。 谢谢, 澈
答案 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)
应用于轴,这将在用户缩放时缩放。请注意,这并不能解决大多数问题,但在类似情况下可能对其他人有用。