如何在 python 中找到 kde 直方图的模式(数字)
How can I find the mode (a number) of a kde histogram in python
我想确定直方图中选择最高的 X 值。
打印直方图的代码:
fig=sns.displot(data=df, x='degrees', hue="TYPE", kind="kde", height=6, aspect=2)
plt.xticks(np.arange(10, 20, step=0.5))
plt.xlim(10, 20)
plt.grid(axis="x")
想要直方图和值(事实上,我想要所有 4 个):
您将需要使用 matplotlib
方法为您的线条检索基础 x 和 y 数据。
如果您在摘录中使用 displot
,那么这里有一个玩具数据集的解决方案,有两个组,它们都打印 x
值并为该值绘制一条垂直线. x
值是通过首先找到最大的 y
值,然后使用该值的索引来定位 x
值。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from seaborn import displot
np.random.RandomState(42)
d1 = pd.DataFrame({'x': np.random.normal(3, 0.2, 100), 'type': 'd1'})
d2 = pd.DataFrame({'x': np.random.normal(3.3, 0.3, 100), 'type': 'd2'})
df = pd.concat([d1,d2], axis=0, ignore_index=True)
my_kde = displot(data=df, x='x', hue='type', kind='kde')
axes = my_kde.axes.flatten()
for i, ax in enumerate(axes):
max_xs = []
for line in ax.lines:
max_x = line.get_xdata()[np.argmax(line.get_ydata())]
print(max_x)
max_xs.append(max_x)
for max_x in max_xs:
ax.axvline(max_x, ls='--', color='black')
# 3.283798164938401
# 3.0426118489704757
如果您决定使用 kdeplot
,则语法略有不同:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from seaborn import kdeplot
np.random.RandomState(42)
d1 = pd.DataFrame({'x': np.random.normal(3, 0.2, 100), 'type': 'd1'})
d2 = pd.DataFrame({'x': np.random.normal(3.3, 0.3, 100), 'type': 'd2'})
df = pd.concat([d1,d2], axis=0, ignore_index=True)
fig, ax = plt.subplots()
my_kde = kdeplot(data=df, x='x', hue='type', ax=ax)
lines = my_kde.get_lines()
for line in lines:
x, y = line.get_data()
print(x[np.argmax(y)])
ax.axvline(x[np.argmax(y)], ls='--', color='black')
# 3.371128998664264
# 2.944974720030946
我想确定直方图中选择最高的 X 值。
打印直方图的代码:
fig=sns.displot(data=df, x='degrees', hue="TYPE", kind="kde", height=6, aspect=2)
plt.xticks(np.arange(10, 20, step=0.5))
plt.xlim(10, 20)
plt.grid(axis="x")
想要直方图和值(事实上,我想要所有 4 个):
您将需要使用 matplotlib
方法为您的线条检索基础 x 和 y 数据。
如果您在摘录中使用 displot
,那么这里有一个玩具数据集的解决方案,有两个组,它们都打印 x
值并为该值绘制一条垂直线. x
值是通过首先找到最大的 y
值,然后使用该值的索引来定位 x
值。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from seaborn import displot
np.random.RandomState(42)
d1 = pd.DataFrame({'x': np.random.normal(3, 0.2, 100), 'type': 'd1'})
d2 = pd.DataFrame({'x': np.random.normal(3.3, 0.3, 100), 'type': 'd2'})
df = pd.concat([d1,d2], axis=0, ignore_index=True)
my_kde = displot(data=df, x='x', hue='type', kind='kde')
axes = my_kde.axes.flatten()
for i, ax in enumerate(axes):
max_xs = []
for line in ax.lines:
max_x = line.get_xdata()[np.argmax(line.get_ydata())]
print(max_x)
max_xs.append(max_x)
for max_x in max_xs:
ax.axvline(max_x, ls='--', color='black')
# 3.283798164938401
# 3.0426118489704757
如果您决定使用 kdeplot
,则语法略有不同:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from seaborn import kdeplot
np.random.RandomState(42)
d1 = pd.DataFrame({'x': np.random.normal(3, 0.2, 100), 'type': 'd1'})
d2 = pd.DataFrame({'x': np.random.normal(3.3, 0.3, 100), 'type': 'd2'})
df = pd.concat([d1,d2], axis=0, ignore_index=True)
fig, ax = plt.subplots()
my_kde = kdeplot(data=df, x='x', hue='type', ax=ax)
lines = my_kde.get_lines()
for line in lines:
x, y = line.get_data()
print(x[np.argmax(y)])
ax.axvline(x[np.argmax(y)], ls='--', color='black')
# 3.371128998664264
# 2.944974720030946