私は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
私は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
ここでの問題は、ティックをフォーマットするクラスがあり、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()
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