模拟已弃用的 seaborn distplots
Emulating deprecated seaborn distplots
Seaborn distplot
is now deprecated and will be removed in a future version. It is suggested to use histplot
(or displot
作为图形级别的情节)作为替代。但是 distplot
和 histplot
之间的预设不同:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
x_list = [1, 2, 3, 4, 6, 7, 9, 9, 9, 10]
df = pd.DataFrame({"X": x_list, "Y": range(len(x_list))})
f, (ax_dist, ax_hist) = plt.subplots(2, sharex=True)
sns.distplot(df["X"], ax=ax_dist)
ax_dist.set_title("old distplot")
sns.histplot(data=df, x="X", ax=ax_hist)
ax_hist.set_title("new histplot")
plt.show()
那么,我们如何配置 histplot
来复制已弃用的 distplot
的输出?
因为我花了一些时间在这上面,我想我分享这个以便其他人可以轻松地适应这种方法:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
x_list = [1, 2, 3, 4, 6, 7, 9, 9, 9, 10]
df = pd.DataFrame({"X": x_list, "Y": range(len(x_list))})
f, (ax_dist, ax_hist) = plt.subplots(2, sharex=True)
sns.distplot(df["X"], ax=ax_dist)
ax_dist.set_title("old distplot")
_, FD_bins = np.histogram(x_list, bins="fd")
bin_nr = min(len(FD_bins)-1, 50)
sns.histplot(data=df, x="X", ax=ax_hist, bins=bin_nr, stat="density", alpha=0.4, kde=True, kde_kws={"cut": 3})
ax_hist.set_title("new histplot")
plt.show()
示例输出:
主要变化是
bins=bin_nr
- 使用 Freedman 确定直方图 bin
Diaconis Estimator 并将上限限制为 50
stat="density"
- 在直方图中显示密度而不是计数
alpha=0.4
- 相同的透明度
kde=True
- 添加核密度图
kde_kws={"cut": 3}
- 将核密度图扩展到直方图限制之外
关于bins="fd"
的bin估计,我不确定这是否确实是distplot
使用的方法。非常欢迎评论和更正。
我删除了 **{"linewidth": 0}
因为 distplot
正如@mwaskom 在评论中指出的那样,直方图条周围有一条 edgecolor
线,可以由 matplotlib 设置为默认值facecolor
。因此,您必须根据自己的风格偏好来解决这个问题。
Seaborn distplot
is now deprecated and will be removed in a future version. It is suggested to use histplot
(or displot
作为图形级别的情节)作为替代。但是 distplot
和 histplot
之间的预设不同:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
x_list = [1, 2, 3, 4, 6, 7, 9, 9, 9, 10]
df = pd.DataFrame({"X": x_list, "Y": range(len(x_list))})
f, (ax_dist, ax_hist) = plt.subplots(2, sharex=True)
sns.distplot(df["X"], ax=ax_dist)
ax_dist.set_title("old distplot")
sns.histplot(data=df, x="X", ax=ax_hist)
ax_hist.set_title("new histplot")
plt.show()
那么,我们如何配置 histplot
来复制已弃用的 distplot
的输出?
因为我花了一些时间在这上面,我想我分享这个以便其他人可以轻松地适应这种方法:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
x_list = [1, 2, 3, 4, 6, 7, 9, 9, 9, 10]
df = pd.DataFrame({"X": x_list, "Y": range(len(x_list))})
f, (ax_dist, ax_hist) = plt.subplots(2, sharex=True)
sns.distplot(df["X"], ax=ax_dist)
ax_dist.set_title("old distplot")
_, FD_bins = np.histogram(x_list, bins="fd")
bin_nr = min(len(FD_bins)-1, 50)
sns.histplot(data=df, x="X", ax=ax_hist, bins=bin_nr, stat="density", alpha=0.4, kde=True, kde_kws={"cut": 3})
ax_hist.set_title("new histplot")
plt.show()
示例输出:
主要变化是
bins=bin_nr
- 使用 Freedman 确定直方图 bin Diaconis Estimator 并将上限限制为 50stat="density"
- 在直方图中显示密度而不是计数alpha=0.4
- 相同的透明度kde=True
- 添加核密度图kde_kws={"cut": 3}
- 将核密度图扩展到直方图限制之外
关于bins="fd"
的bin估计,我不确定这是否确实是distplot
使用的方法。非常欢迎评论和更正。
我删除了 **{"linewidth": 0}
因为 distplot
正如@mwaskom 在评论中指出的那样,直方图条周围有一条 edgecolor
线,可以由 matplotlib 设置为默认值facecolor
。因此,您必须根据自己的风格偏好来解决这个问题。