Matplotlib:在x轴上显示选定的日期标签

时间:2019-05-11 08:30:00

标签: python matplotlib axis-labels

在我的matplotlib图中,日期时间x轴当前使用

格式化。
ax.xaxis.set_major_locator(dt.MonthLocator())
ax.xaxis.set_major_formatter(dt.DateFormatter('%d %b'))
ax.xaxis.set_minor_locator(dt.DayLocator())
ax.xaxis.set_minor_formatter(ticker.NullFormatter())

Current graph

我想为小刻度线添加标签,但只有一些值。预期:

enter image description here

我应该使用什么minor_formatter

1 个答案:

答案 0 :(得分:2)

次要刻度线需要具有选择性标签-仅在具有特定值的日期显示。为了选择日期,我想出了自己的格式化程序,该格式化程序带有一个谓词(传递日期时间时函数返回true / false的谓词),该谓词包装了DateFormatter以对字符串进行实际格式化。这样可以采用更通用的方法(例如,您只能显示周末)

import matplotlib.dates as dt
import matplotlib.ticker as ticker

class SelectiveDateFormatter(ticker.Formatter):

    def __init__(self, predicate, date_formatter, tz=None):
        if tz is None:
            tz = dt._get_rc_timezone()
        self.predicate = predicate
        self.dateFormatter = date_formatter
        self.tz = tz

    def __call__(self, x, pos=0):
        if x == 0:
            raise ValueError('DateFormatter found a value of x=0, which is '
                         'an illegal date; this usually occurs because '
                         'you have not informed the axis that it is '
                         'plotting dates, e.g., with ax.xaxis_date()')
        current_date = dt.num2date(x, self.tz)
        should_print = self.predicate(current_date)
        if should_print:
            return self.dateFormatter(x, pos)
        else:
            return ""

    def set_tzinfo(self, tz):
        self.tz = tz

您可以像这样使用它来达到我的示例:

predicate = lambda d: d.day % 10 == 0
format = dt.DateFormatter('%d')
selective_fmt = SelectiveDateFormatter(predicate, format)
ax.xaxis.set_minor_formatter(selective_fmt)

或者仅显示周末:

predicate = lambda d: d.weekday() >= 5
...