当我绘制半小时时间序列时,我的轴标签是奇数(如16:33:12h左右......) 当我使用HourLocator来解决这个问题时(16:33h - > 16:00h),我的x标签完全消失了。
我的代码是:
from datetime import date, timedelta, datetime, time
from matplotlib.dates import DayLocator, HourLocator
import matplotlib.pyplot as plt
start = time(0, 0, 0)
delta = timedelta(minutes=30)
times = []
for i in range(len(day_load)):
dt = datetime.combine(date.today(), time(0, 0)) + delta * i
times.append(dt.time())
load = [i/48 for i in range(48)]
fig, ax = plt.subplots()
ax.plot_date(times, load)
ax.xaxis.set_major_locator(HourLocator())
plt.show()
如何实现“均匀”标签(以最佳实践方式 - 我不想再为其他所有情节重写代码)。 当我评论倒数第二行时,我会得到正常的“奇数”标签:(
感谢您的回答!
答案 0 :(得分:1)
有两个主要问题:
dt.time()
而不是dt
。DateFormatter("%H:%M")
来显示小时和分钟。完整代码:
from datetime import date, timedelta, datetime, time
from matplotlib.dates import DayLocator, HourLocator,DateFormatter
import matplotlib.pyplot as plt
start = time(0, 0, 0)
delta = timedelta(minutes=30)
times = []
n=48
for i in range(n):
# use complete datetime object, not only time
dt = datetime.combine(date.today(), time(0, 0)) + delta * i
times.append(dt)
load = [i/float(n) for i in range(n)]
fig, ax = plt.subplots()
ax.plot_date(times, load)
# set a locator, as well as a formatter
ax.xaxis.set_major_locator(HourLocator())
ax.xaxis.set_major_formatter(DateFormatter("%H:%M"))
#optionally rotate the labels and make more space for them
fig.autofmt_xdate()
plt.show()
答案 1 :(得分:0)
您的代码无法运行,因为day_load
未定义,我也遇到了其他问题。
不是答案,但我认为您最好使用pandas
。它可以轻松创建date_range
,并且无需调整即可很好地处理绘图。
from scipy import stats
import pandas as pd
n = 20
index = pd.date_range(start = '2016-01-01', periods = n, freq='1H')
df = pd.DataFrame(index = index)
df["value"] = stats.norm().rvs(n)
df.plot()
答案 2 :(得分:0)
这是一个古老的问题,但对于面临此问题的其他任何人:您可以保留数据类型应为的数据类型,并使用matplotlib.ticker.IndexLocator
来确定轴刻度线的位置。
例如,
locator = mpl.ticker.IndexLocator(base=2 * 60 * 60, offset=0)
ax.xaxis.set_major_locator(locator)
每两个完整小时放置一个刻度,即,它使用自午夜以来的总秒数,而与数据中间隔的长度无关。