Matplotlib 自动日期定位器自定义日期格式?

4 投票
1 回答
3711 浏览
提问于 2025-04-15 23:43

我正在使用Matplotlib这个工具,从数据库动态生成.png格式的图表。用户可以选择任何时间范围作为x轴,而我需要考虑到所有这些情况。虽然Matplotlib有一个叫dates.AutoDateLocator()的功能,但我希望图表上显示的日期时间格式能够根据具体情况来调整。比如说,如果用户绘制的是下午3点到5点的图表,那么就不需要显示年份、月份和日期的信息。目前,我是手动创建Locator和Formatter对象,像这样:

def get_ticks(start, end):
    from datetime import timedelta as td
    delta = end - start

    if delta <= td(minutes=10):
        loc = mdates.MinuteLocator()
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(minutes=30):
        loc = mdates.MinuteLocator(byminute=range(0,60,5))
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(hours=1):
        loc = mdates.MinuteLocator(byminute=range(0,60,15))
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(hours=6):
        loc = mdates.HourLocator()
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(days=1):
        loc = mdates.HourLocator(byhour=range(0,24,3))
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(days=3):
        loc = mdates.HourLocator(byhour=range(0,24,6))
        fmt = mdates.DateFormatter('%I:%M %p')
    elif delta <= td(weeks=2):
        loc = mdates.DayLocator()
        fmt = mdates.DateFormatter('%b %d')
    elif delta <= td(weeks=12):
        loc = mdates.WeekdayLocator()
        fmt = mdates.DateFormatter('%b %d')
    elif delta <= td(weeks=52):
        loc = mdates.MonthLocator()
        fmt = mdates.DateFormatter('%b')
    else:
        loc = mdates.MonthLocator(interval=3)
        fmt = mdates.DateFormatter('%b %Y')
    return loc,fmt

有没有更好的方法来做到这一点呢?

1 个回答

2

你觉得AutoDateFormatter能满足你的需求吗?即使它不能,你也可以看看它的源代码,里面有一种更简洁的方法来选择格式字符串。

在发布的版本中,你不能自定义每个级别的格式,但在开发代码中是可以的。你可以把主干中的版本复制到你自己的代码里。

撰写回答