<p>如果假设每个可能的工作日和小时都实际出现在数据中,那么轴的单位就是小时,周一午夜为0,周日23h为24*7-1=167。
然后,你可以每24小时用主要的记号勾选一次,并在每一个中午标注一周中的每一天。在</p>
<pre><code>import numpy as np; np.random.seed(42)
import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter, NullFormatter
# Generate example data
N = 5030
delta = (dt.datetime(2019, 1, 1) - dt.datetime(2018, 1, 1)).total_seconds()
df = pd.DataFrame({'datetime': np.array("2018-01-01").astype(np.datetime64) +
(delta*np.random.rand(N)).astype(np.timedelta64)})
# Group the data
df['weekday'] = df['datetime'].dt.weekday
df['hour'] = df['datetime'].dt.hour
counts = df.groupby(['weekday', 'hour'])['datetime'].count()
ax = counts.plot(kind='line', color='blue')
ax.set_ylabel("#")
ax.set_xlabel("time")
ax.grid()
# Now we assume that there is data for every hour and day present
assert len(counts) == 7*24
# Hence we can tick the axis with multiples of 24h
ax.xaxis.set_major_locator(MultipleLocator(24))
ax.xaxis.set_minor_locator(MultipleLocator(1))
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
def tick(x,pos):
if x % 24 == 12:
return days[int(x)//24]
else:
return ""
ax.xaxis.set_major_formatter(NullFormatter())
ax.xaxis.set_minor_formatter(FuncFormatter(tick))
ax.tick_params(which="major", axis="x", length=10, width=1.5)
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/J8aSa.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/J8aSa.png" alt="enter image description here"/></a></p>