如何更改 seaborn 直方图以在一天中的几个小时内工作?

How to change a seaborn histogram plot to work for hours of the day?

我有一个 pandas 数据帧,其中包含许多不同开始时间和长度的时间间隔。我对 24 小时内开始时间的分布很感兴趣。因此,我还有另一列名为 Hour 的专栏。我使用 seaborn 绘制了一个直方图来查看分布,但显然 x 轴从 0 开始并运行到 24。我想知道是否有一种方法可以改变它从8 到 8 并在 23 到 0 循环,因此它从时间角度提供了更好的数据可视化。提前致谢。

sns.distplot(df2['Hour'], bins = 24, kde = False).set(xlim=(0,23))

如果您想在条形图上自定义 x-values 顺序,我建议您直接使用 matplotlib 并将直方图简单地绘制为带有 width=1 的条形图摆脱条形之间的填充。

import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt

# prepare sample data
dates = pd.date_range(
    start=datetime(2020, 1, 1),
    end=datetime(2020, 1, 7),
    freq="H")

random_dates = np.random.choice(dates, 1000)

df = pd.DataFrame(data={"date":random_dates})

df["hour"] = df["date"].dt.hour

# set your preferred order of hours
hour_order = [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,1,2,3,4,5,6,7]

# calculate frequencies of each hour and sort them
plot_df = (
    df["hour"]
    .value_counts()
    .rename_axis("hour", axis=0)
    .reset_index(name="freq")
    .set_index("hour")
    .loc[hour_order]
    .reset_index())

# day / night colour split
day_mask = ((8 <= plot_df["hour"]) & (plot_df["hour"] <= 20))
plot_df["color"] = np.where(day_mask, "skyblue", "midnightblue")

# actual plotting - note that you have to cast hours as strings
fig = plt.figure(figsize=(8,4))
ax = fig.add_subplot(111)

ax.bar(
    x=plot_df["hour"].astype(str),
    height=plot_df["freq"],
    color=plot_df["color"], width=1)

ax.set_xlabel('Hour')
ax.set_ylabel('Frequency')

plt.show()