【问题标题】:How can I find the mode (a number) of a kde histogram in python如何在 python 中找到 kde 直方图的模式(数字)
【发布时间】:2023-01-17 07:41:03
【问题描述】:

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

【问题讨论】:

    标签: python matplotlib statistics seaborn kernel-density


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      对 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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-24
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多