如何更改 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()
我有一个 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()