Matplotlib dates.DateFormatter 强制显示纳秒问题求解
解决Matplotlib DateFormatter显示多余微秒的问题
针对你遇到的问题——既要保留鼠标hover时的精确时间显示(动态定位),又要让X轴刻度只显示到毫秒(去掉末尾三位微秒),可以用以下两种方案:
方案1:自定义日期格式化器
继承Matplotlib的DateFormatter,重写格式化方法,只保留毫秒级别的显示,同时不影响状态栏的精确时间展示:
import matplotlib.dates as md import matplotlib.pyplot as plt import pandas as pd class MillisecondDateFormatter(md.DateFormatter): def format(self, dt, pos=None): # 先获取完整的时间字符串 full_time = super().format(dt, pos) # 截断末尾三位微秒,只保留毫秒部分 return full_time[:-3] # 构造示例数据 df = pd.DataFrame({ 'timestamp': pd.to_datetime([ '2022-03-13 03:19:59.999070', '2022-03-13 03:20:00.004070', '2022-03-13 03:20:00.009070', '2022-03-13 03:20:00.014070' ]), 'val': ['X1', 'X2', 'X3', 'X4'] }) # 绘图逻辑 ax = plt.gca() xfmt = MillisecondDateFormatter('%H:%M:%S.%f') ax.xaxis.set_major_formatter(xfmt) plt.plot(df.timestamp, df.val, linestyle="-", marker=".") plt.setp(ax.get_xticklabels(), rotation=40) plt.show()
方案2:手动修改刻度标签文本
如果不想自定义类,可以在设置完默认格式化器后,直接遍历并修改所有X轴刻度的显示文本:
import matplotlib.dates as md import matplotlib.pyplot as plt import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'timestamp': pd.to_datetime([ '2022-03-13 03:19:59.999070', '2022-03-13 03:20:00.004070', '2022-03-13 03:20:00.009070', '2022-03-13 03:20:00.014070' ]), 'val': ['X1', 'X2', 'X3', 'X4'] }) # 绘图逻辑 ax = plt.gca() xfmt = md.DateFormatter('%H:%M:%S.%f') ax.xaxis.set_major_formatter(xfmt) plt.plot(df.timestamp, df.val, linestyle="-", marker=".") # 遍历刻度标签,截断微秒部分 for label in ax.get_xticklabels(): txt = label.get_text() if '.' in txt: label.set_text(txt[:-3]) plt.setp(ax.get_xticklabels(), rotation=40) plt.show()
两种方案都能实现需求:X轴刻度只显示到%H:%M:%S.%3f格式(比如03:19:59.999),而鼠标在图表上移动时,底部状态栏依然会显示完整的精确时间戳(包含所有微秒位数)。
内容的提问来源于stack exchange,提问作者ohpif
相关产品推荐
相关产品推荐

