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ます。これをミリ秒単位で表示する方法はわかりませんが、マイクロ秒単位で表示されるので、うまくいくと思います。結局のところ、それはただ1つの余分なゼロです。このコードを試してください:

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 に答える