我正在使用 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
我不知道如何让它显示毫秒,但它会显示微秒,我希望这对你有用;毕竟,这只是一个额外的零。试试这个代码:
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
而不是复制所有的绒毛(并且必须进行本地导入),但我尝试过,失败了,并认为这对我来说已经足够了!