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

Posted

技术标签:

【中文标题】如何更改 seaborn 直方图以在一天中的几个小时内工作?【英文标题】:How to change a seaborn histogram plot to work for hours of the day? 【发布时间】:2021-01-11 17:38:38 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

如果您想在条形图上自定义 x 值顺序,我建议直接使用 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()

【讨论】:

非常感谢!!你真的非常好,完全回答了我的问题以及一些额外的问题。颜色变化很棒。有什么办法可以在白天、夜间和夜间使用更深的颜色来制作三种颜色(例如,可能是加深的蓝色阴影)?我猜比两个难,因为它必须比使用 np.where 更复杂。再次感谢!! 当然,您可以嵌套 np.where 像这样 np.where(condition_1, color_1, np.where(condition_2, color_2, color_3) 或在单独的调用中为每个条件执行更新,如下所示:plot_df.loc[condition_1, 'color'] = color_1

以上是关于如何更改 seaborn 直方图以在一天中的几个小时内工作?的主要内容,如果未能解决你的问题,请参考以下文章

Python - Seaborn可视化:图形个性化设置的几个小技巧

如何仅在一天中的特定时间运行 Python 脚本?

Crontab 在一天中的两个小时运行,但其中一个小时不包括一周中的某些天

当且仅当有新的提交时,如何在一天中的特定时间构建 XCode 机器人?

Firebase函数在一天中的特定时间重置值[重复]

Cloud Functions for Firebase - 在一天中的特定时间更新值,每天 [重复]