displot被反对为displot。
前一个函数可以选择绘制一条正常曲线。
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats
ax = sns.distplot(df.extracted, bins=40, kde=False, fit=stats.norm)
适合=统计数据。诺姆不再和精神错乱打交道了。在这个问题的答案中,我看到了稍后绘制正常曲线的方法,但它是在平均为0的随机数据上完成的。
# # #seaborn.displot
is是数字级的图吗kind
parameter specifies the approach.参数指定方法。当kind='hist'
the parameters for seaborn.hist的参数
seaborn.histplot
are available.是可用的。
有关轴水平图,请参见如何在海运直方图上添加标准正常pdf
map需要dataframe列名来将pdf映射到seaborn上。拆解需要在数据帧中的数据。
一个问题是x_pdf
is calculated fo为每个axes
::
X0 x1 = p1。axes[0][0]。get_xlim()
如果axes
are di对于多个方面(sharex=False
) then there's not a way to get axes
with为每一个axes
within
引用:
Seaborn的histplot和displot输出不匹配
构建结构化的多小区网格
测试python 3.8.11
pan
pandas 1.3.2
matplotlib 3.4.2
seaborn 0.11.2
单一的方面
。map可以使用
import pandas as pd
import seaborn as sns
import numpy as np
import scipy
# data
np.random.seed(365)
x1 = np.random.normal(10, 3.4, size=1000) # mean of 10
df = pd.DataFrame({'x1': x1})
# display(df.head(3))
x1
0 10.570932
1 11.779918
2 12.779077
# function for mapping the pdf
def map_pdf(x, **kwargs):
mu, std = scipy.stats.norm.fit(x)
x0, x1 = p1.axes[0][0].get_xlim() # axes for p1 is required to determine x_pdf
x_pdf = np.linspace(x0, x1, 100)
y_pdf = scipy.stats.norm.pdf(x_pdf, mu, std)
plt.plot(x_pdf, y_pdf, c='r')
p1 = sns.displot(data=df, x='x1', kind='hist', bins=40, stat='density')
p1.map(map_pdf, 'x1')
单个或多个层面
迭代每个轴并添加pdf会更容易
# data
np.random.seed(365)
x1 = np.random.normal(10, 3.4, size=1000) # mean of 10
x2 = np.random.standard_normal(1000) # mean of 0
df = pd.DataFrame({'x1': x1, 'x2': x2}).melt() # create long dataframe
# display(df.head(3))
variable value
0 x1 10.570932
1 x1 11.779918
2 x1 12.779077
p1 = sns.displot(data=df, x='value', col='variable', kind='hist', bins=40, stat='density', common_bins=False,
common_norm=False, facet_kws={'sharey': True, 'sharex': False})
# extract and flatten the axes from the figure
axes = p1.axes.ravel()
# iterate through each axes
for ax in axes:
# extract the variable name
var = ax.get_title().split(' = ')[1]
# select the data for the variable
data = df[df.variable.eq(var)]
mu, std = scipy.stats.norm.fit(data['value'])
x0, x1 = ax.get_xlim()
x_pdf = np.linspace(x0, x1, 100)
y_pdf = scipy.stats.norm.pdf(x_pdf, mu, std)
ax.plot(x_pdf, y_pdf, c='r')
###如果你想复制相同的情节作为你的distplot
I suggest using histplot
. Fitting our d我建议使用histplot
. Fitting our dat. 将我们的数据与法线相匹配只需要一行代码。
import numpy as np
from scipy import stats
import seaborn as sns
x = np.random.normal(10, 3.4, size=1000)
ax = sns.histplot(x, bins=40, stat='density')
mu, std = stats.norm.fit(x)
xx = np.linspace(*ax.get_xlim(),100)
ax.plot(xx, stats.norm.pdf(xx, mu, std));
输出