如何更改 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可视化:图形个性化设置的几个小技巧
Crontab 在一天中的两个小时运行,但其中一个小时不包括一周中的某些天