如何使用 seaborn 绘制每个离散变量的计数(这里的计数不仅仅是频率,而是一个定义值)
How to plot the count of each discrete variable using seaborn (here count is not simply the frequency but a defined value)
我有一个 pandas 数据框。 pandas 数据框有一个“小时”列,它仅包含从 1 到 24 的整数值,但每个小时都有多个条目。还有另一个名为“计数”的列,它给出了每个整数小时的计数。
我想创建一个直方图,最好在 seaborn 中使用 distplot
每个整数小时对小时的计数。我可以分别总结每个不同小时的计数,然后绘制它,但我想知道是否有自动方法来执行此操作?
例如,假设我在第 1 小时 [1, 20], [1, 50]
有两个条目。对于直方图上的第 1 小时,我希望它绘制 20 + 50 = 70 而不是 2.
Seaborn 的 histplot
接受一个参数 weights=
(类似于 plt.hist
中的 weigths
),它给出了每个 x 值的相对权重。设置 discrete=True
可确保围绕这些离散值很好地计算 bin 边界。
或者,可以使用 sns.barplot
,使用总和作为估算器。这会自动为每个值设置一个 x-tick 并选择一个配色方案。需要 ci=None
以避免错误栏。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
df = pd.DataFrame({'hour': np.repeat(np.arange(24), 3),
'count': np.arange(72)})
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 4))
sns.histplot(data=df, x='hour', weights='count', discrete=True, color='darkturquoise', ax=ax1)
ax1.set_xticks(np.arange(24))
ax1.set_title('sns.histplot')
sns.barplot(data=df, x='hour', y='count', estimator=np.sum, ci=None, ax=ax2)
ax2.set_title('sns.barplot')
plt.tight_layout()
plt.show()
我有一个 pandas 数据框。 pandas 数据框有一个“小时”列,它仅包含从 1 到 24 的整数值,但每个小时都有多个条目。还有另一个名为“计数”的列,它给出了每个整数小时的计数。
我想创建一个直方图,最好在 seaborn 中使用 distplot
每个整数小时对小时的计数。我可以分别总结每个不同小时的计数,然后绘制它,但我想知道是否有自动方法来执行此操作?
例如,假设我在第 1 小时 [1, 20], [1, 50]
有两个条目。对于直方图上的第 1 小时,我希望它绘制 20 + 50 = 70 而不是 2.
Seaborn 的 histplot
接受一个参数 weights=
(类似于 plt.hist
中的 weigths
),它给出了每个 x 值的相对权重。设置 discrete=True
可确保围绕这些离散值很好地计算 bin 边界。
或者,可以使用 sns.barplot
,使用总和作为估算器。这会自动为每个值设置一个 x-tick 并选择一个配色方案。需要 ci=None
以避免错误栏。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
df = pd.DataFrame({'hour': np.repeat(np.arange(24), 3),
'count': np.arange(72)})
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 4))
sns.histplot(data=df, x='hour', weights='count', discrete=True, color='darkturquoise', ax=ax1)
ax1.set_xticks(np.arange(24))
ax1.set_title('sns.histplot')
sns.barplot(data=df, x='hour', y='count', estimator=np.sum, ci=None, ax=ax2)
ax2.set_title('sns.barplot')
plt.tight_layout()
plt.show()