Datetime 使用matplotlib打印格式为DD HH:MM:SS的时间增量轴
我正在使用Matplotlib绘制赛车赛事的速度/距离数据,例如距离与时间,时间为水平轴,距离为垂直轴 我的输入是两个向量,一个包含事件开始时的时间值(以秒为单位),另一个包含到目前为止行驶的距离。在同一个情节中可能有许多运动员,所以我可以比较他们 问题是,如果我绘制纯时间,我会得到以秒为单位的X轴,这是不自然的: 我可以根据一天中的实际日期和时间绘制数据,并得到可读的结果,但这是绝对时间,而不是事件开始后经过的时间。这一次大约在上午6:00开始: 我想要的是一种以HMS格式获取经过时间的方法,与第二个图形相同,但与事件开始相关的时间,以及缩放级别切换到小时:分钟,然后在缩放级别更改时切换到天:小时,以免标签与缩放无关的数据过于接近Datetime 使用matplotlib打印格式为DD HH:MM:SS的时间增量轴,datetime,matplotlib,timedelta,axis-labels,Datetime,Matplotlib,Timedelta,Axis Labels,我正在使用Matplotlib绘制赛车赛事的速度/距离数据,例如距离与时间,时间为水平轴,距离为垂直轴 我的输入是两个向量,一个包含事件开始时的时间值(以秒为单位),另一个包含到目前为止行驶的距离。在同一个情节中可能有许多运动员,所以我可以比较他们 问题是,如果我绘制纯时间,我会得到以秒为单位的X轴,这是不自然的: 我可以根据一天中的实际日期和时间绘制数据,并得到可读的结果,但这是绝对时间,而不是事件开始后经过的时间。这一次大约在上午6:00开始: 我想要的是一种以HMS格式获取经过时间的方法,
谢谢你的帮助 我认为最简单的方法是编写自己的格式化程序,将其转换为HMS
import matplotlib
class myFormatter(matplotlib.ticker.Formatter):
def __call__(self,in_value_in_seconds,pos=None):
hours = int(in_value_in_seconds//(3600))
in_value_in_seconds -= hours * 3600
mins = int(in_value_in_seconds//(60))
in_value_in_seconds -= mins * 60
secs = int(in_value_in_seconds)
return str(hours) + ":" + str(mins) + ":" + str(secs)
我认为这是最简单的情况,不支持任何缩放。最好将这些逻辑的一部分放入datetime.deltatime对象中,或者将它们作为参数
结合MultipleLocator,您可以很好地控制刻度的位置。我认为最简单的方法是编写自己的格式化程序,将刻度转换为HMS
import matplotlib
class myFormatter(matplotlib.ticker.Formatter):
def __call__(self,in_value_in_seconds,pos=None):
hours = int(in_value_in_seconds//(3600))
in_value_in_seconds -= hours * 3600
mins = int(in_value_in_seconds//(60))
in_value_in_seconds -= mins * 60
secs = int(in_value_in_seconds)
return str(hours) + ":" + str(mins) + ":" + str(secs)
我认为这是最简单的情况,不支持任何缩放。最好将这些逻辑的一部分放入datetime.deltatime对象中,或者将它们作为参数
与MultipleLocator相结合,您可以很好地控制滴答声的位置。我发现了以下几点,这就是我正在使用的。仍然不完美不使用60的倍数作为主要刻度,但格式本身就是我想要的:
def HMS(seconds, pos):
seconds = int(seconds)
hours = seconds / 3600
seconds -= 3600 * hours
minutes = seconds / 60
seconds -= 60 * minutes
if hours == 0:
if minutes == 0:
return "%ds" % (seconds)
return "%dm%02ds" % (minutes, seconds)
return "%dh%02dm" % (hours, minutes)
ax = plt.gca()
ax.xaxis.set_major_formatter(plt.FuncFormatter(HMS))
我发现了以下,这就是我正在使用的。仍然不完美不使用60的倍数作为主要刻度,但格式本身就是我想要的:
def HMS(seconds, pos):
seconds = int(seconds)
hours = seconds / 3600
seconds -= 3600 * hours
minutes = seconds / 60
seconds -= 60 * minutes
if hours == 0:
if minutes == 0:
return "%ds" % (seconds)
return "%dm%02ds" % (minutes, seconds)
return "%dh%02dm" % (hours, minutes)
ax = plt.gca()
ax.xaxis.set_major_formatter(plt.FuncFormatter(HMS))
最后我做了这件事,我要加上我自己的答案以备将来参考。谢谢最后我做了这件事,我要加上我自己的答案以备将来参考。谢谢