13

我正在使用 matplotlib 以 hh:mm:ss.ms 格式将数据绘制为时间函数,其中 ms 是毫秒。但是,我看不到图中的毫秒数。是否也可以添加它们?

dates = matplotlib.dates.datestr2num(x_values) # convert string dates to numbers
plt.plot_date(dates, y_values)  # doesn't show milliseconds
4

2 回答 2

20

这里的问题是有一个类来格式化刻度,而 plot_date 将该类设置为您不想要的东西:一个从不绘制毫秒的自动格式化程序。

为了改变这一点,您需要从更改matplotlib.dates.AutoDateFormatter为您自己的格式化程序。使用格式字符串matplotlib.dates.DateFormatter(fmt)创建格式化程序。datetime.strftime我不知道如何让它显示毫秒,但它会显示微秒,我希望这对你有用;毕竟,这只是一个额外的零。试试这个代码:

dates = matplotlib.dates.datestr2num(x_values) # convert string dates to numbers
plt.plot_date(dates, y_values)  # doesn't show milliseconds by default.

# This changes the formatter.
plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter("%H:%M:%S.%f"))

# Redraw the plot.
plt.draw()
于 2012-06-29T22:14:43.153 回答
3

FWIW,我遇到了这个问题并做了一个解决方法,我从我的包的 util 模块导入。微秒的精度太高了,只是秒太少了——现在我可以选择我需要的精度(默认毫秒):

import matplotlib.ticker as ticker


class PrecisionDateFormatter(ticker.Formatter):
    """
    Extend the `matplotlib.ticker.Formatter` class to allow for millisecond
    precision when formatting a tick (in days since the epoch) with a
    `~datetime.datetime.strftime` format string.

    """

    def __init__(self, fmt, precision=3, tz=None):
        """
        Parameters
        ----------
        fmt : str
            `~datetime.datetime.strftime` format string.
        """
        from matplotlib.dates import num2date
        if tz is None:
            from matplotlib.dates import _get_rc_timezone
            tz = _get_rc_timezone()
        self.num2date = num2date
        self.fmt = fmt
        self.tz = tz
        self.precision = precision

    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()")

        dt = self.num2date(x, self.tz)
        ms = dt.strftime("%f")[:self.precision]

        return dt.strftime(self.fmt).format(ms=ms)

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

因此用作:

from my_util import PrecisionDateFormatter

ax.xaxis.set_major_formatter(PrecisionDateFormatter("%H:%M:%S.{ms}"))

可能只修改一次导入的__call__方法DateFormatter而不是复制所有的绒毛(并且必须进行本地导入),但我尝试过,失败了,并认为这对我来说已经足够了!

于 2020-07-10T13:00:50.183 回答