<p>首先,请注意,仅从频率创建kde绘图时,会丢失重要信息</p>
<p><code>sns.histplot()</code>有一个参数<code>weights=</code>可以处理频率。我没有看到使用长数据帧和<code>hue</code>来实现这一点的方法,但是您可以为每个列分别调用<code>histplot</code>。以下是从生成的数据开始的示例:</p>
<pre class="lang-py prettyprint-override"><code>import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
sns.set()
bins = np.array([0, 2500, 5000, 7500, 10000, 12500, 15000, 17500, 20000])
df = pd.DataFrame({'counts': np.random.randint(2, 30, 8),
'theoretical counts': np.random.randint(2, 30, 8)},
index=pd.interval_range(0, 20000, freq=2500))
df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
fig, ax = plt.subplots()
for column, color in zip(['counts', 'theoretical counts'], ['cornflowerblue', 'crimson']):
sns.histplot(x=(bins[:-1] + bins[1:]) / 2, weights=df[column], bins=8, binrange=(0, 20000),
kde=True, kde_kws={'cut': .3},
color=color, alpha=0.5, label=column, ax=ax)
ax.legend()
ax.set_xticks(range(0, 20001, 2500))
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/chIID.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/chIID.png" alt="sns.histplot from frequencies"/></a></p>
<p>由于箱子宽度变化很大,因此没有足够的信息来绘制合适的kde曲线。此外,条形图似乎比直方图更合适。以下是一个示例:</p>
<pre><code>import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
sns.set()
bins = [0, 250, 500, 1000, 1500, 2500, 5000, 10000, 50000, np.inf]
bin_labels = [f'{b0}-{b1}' for b0, b1, in zip(bins[:-1], bins[1:])]
df = pd.DataFrame({'counts': np.random.randint(2, 30, 9),
'theoretical counts': np.random.randint(2, 30, 9)})
df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
fig, ax = plt.subplots(figsize=(10, 4))
sns.barplot(data=df.melt(), x=np.tile(bin_labels, 2), y='value',
hue='variable', palette=['cornflowerblue', 'crimson'], ax=ax)
plt.tight_layout()
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/MFA6U.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/MFA6U.png" alt="bar plots"/></a></p>
<p><a href="https://seaborn.pydata.org/generated/seaborn.barplot.html" rel="nofollow noreferrer">^{<cd5>}</a>有一些选项,例如<code>dodge=False, alpha=0.5</code>在同一点绘制条形图</p>