matplotlib 如何在python中找到kde直方图的众数

ubof19bj  于 2023-01-17  发布在  Python
关注(0)|答案(2)|浏览(122)

我想确定直方图中具有最高选择的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个):

anauzrmj

anauzrmj1#

您需要使用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

vmpqdwk3

vmpqdwk32#

对AlexK的回答进行了非常细微的扩展:你可以得到垂直虚线的颜色来匹配核的颜色,如下所示:

for line in lines:
    x, y = line.get_data()
    color = line.get_color()
    print(x[np.argmax(y)])
    ax.axvline(x[np.argmax(y)], ls='--', color=color)

相关问题