首先,请注意 distplot 在 Seaborn 0.11 中已贬值。扩展和改进版本现在称为 histplot(带有可选 kde 的直方图)、kdeplot(仅用于 kde)和 displot(创建子图)。
可选的weights= 参数设置每个x 值的权重。 discrete=True 需要为每个 x 值设置一个条形图。 kde 的cut 参数控制曲线在数据点之外绘制的距离。
import matplotlib.pyplot as plt
import seaborn as sns
x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
sns.histplot(x=x, weights=y, discrete=True,
color='darkblue', edgecolor='black',
kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
plt.show()
请注意,如果基础数据是连续的,则通过提供原始数据可以获得更正确的图。
要更改 kde 行的颜色,一个明显的想法是使用line_kws={'color': 'red'},但这在当前的 seaborn 版本 (0.11.1) 中不起作用。
但是,您可以分别绘制histplot 和kdeplot。为了匹配 y 轴,histplot 需要stat='density'(默认为'count')。
ax = sns.histplot(x=x, weights=y, discrete=True, alpha=0.5,
color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
另一种方法是在之后更改线条的颜色,它独立于所选的stat=。
ax = sns.histplot(x=x, weights=y, discrete=True,
color='darkblue', edgecolor='black',
kde=True, kde_kws={'cut': 2}, line_kws={'linewidth': 4})
ax.lines[0].set_color('crimson')
这是一个示例,如何将一个数据集的直方图与另一个数据集的 kde 曲线结合起来:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
import seaborn as sns
x = [30, 31, 32, 33, 34, 35, 36]
y = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
x2 = [20, 21, 22, 23, 24, 25, 26]
y2 = [1000, 2000, 3000, 4000, 3000, 2000, 1000]
ax = sns.histplot(x=x2, weights=y2, discrete=True, alpha=0.5,
color='darkblue', edgecolor='black', stat='density')
sns.kdeplot(x=x, weights=y, color='crimson', cut=2, linewidth=4, ax=ax)
ax.xaxis.set_major_locator(MultipleLocator(1))
plt.show()