Python 如何从频率表中绘制直方图和分布?

Python 如何从频率表中绘制直方图和分布?,python,plot,seaborn,histogram,distribution,Python,Plot,Seaborn,Histogram,Distribution,我有一张频率表 我一直想把这些数据画成这样 所以试过这个, to_plot = compare_df[['counts', 'theoritical counts']] bins=[0,2500,5000,7500,10000,12500,15000,17500,20000] sns.displot(to_plot,bins=bins) 但是结果是这样的,, 知道我做错了什么吗?请帮忙。两件事: 当您向sns.displat提供数据帧时,还需要指定将哪个列作为xkwarg用于分发 这就

我有一张频率表

我一直想把这些数据画成这样

所以试过这个,

to_plot = compare_df[['counts', 'theoritical counts']]
bins=[0,2500,5000,7500,10000,12500,15000,17500,20000]
sns.displot(to_plot,bins=bins)
但是结果是这样的,,

知道我做错了什么吗?请帮忙。

两件事:

  • 当您向
    sns.displat
    提供数据帧时,还需要指定将哪个列作为
    x
    kwarg用于分发

  • 这就引出了第二个问题:我不知道使用
    sns.displat
    获得多个发行版的方法,但您可以大致这样使用
    sns.histplot

  • 结果如下,请注意,我刚刚使用了一个示例数据集,以尽快获得一个粗略的图像:


    首先,请注意,仅从频率创建kde绘图时,会丢失重要信息

    sns.histplot()
    有一个参数
    weights=
    ,可以处理频率。我没有看到使用长数据帧和
    hue
    实现这一点的方法,但是您可以为每个列分别调用
    histplot
    。以下是从生成的数据开始的示例:

    导入matplotlib.pyplot作为plt
    导入seaborn作为sns
    作为pd进口熊猫
    将numpy作为np导入
    sns.set()
    容器=np.数组([0,2500,5000,7500,10000,12500,15000,17500,20000])
    df=pd.DataFrame({'counts':np.random.randint(2,30,8),
    “理论计数”:np.random.randint(2,30,8)},
    索引=局部放电间隔(0,20000,频率=2500))
    df[‘理论计数’]=(3*df[‘计数’]+df[‘理论计数’)//4
    图,ax=plt.子批次()
    对于列,zip中的颜色(['counts','theory counts'],['cornflowerblue','crimson']):
    sns.histplot(x=(bin[:-1]+bin[1:])/2,权重=df[column],bin=8,binrange=(02000),
    kde=True,kde_kws={'cut':.3},
    颜色=颜色,alpha=0.5,标签=列,ax=ax)
    ax.图例()
    斧头组(范围(0,20001,2500))
    plt.show()
    

    由于箱子宽度变化很大,因此没有足够的信息来绘制合适的kde曲线。此外,条形图似乎比直方图更合适。以下是一个示例:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    
    sns.set()
    bins = [0, 250, 500, 1000, 1500, 2500, 5000, 10000, 50000, np.inf]
    bin_labels = [f'{b0}-{b1}' for b0, b1, in zip(bins[:-1], bins[1:])]
    df = pd.DataFrame({'counts': np.random.randint(2, 30, 9),
                       'theoretical counts': np.random.randint(2, 30, 9)})
    df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
    fig, ax = plt.subplots(figsize=(10, 4))
    sns.barplot(data=df.melt(), x=np.tile(bin_labels, 2), y='value',
                hue='variable', palette=['cornflowerblue', 'crimson'], ax=ax)
    plt.tight_layout()
    plt.show()
    


    有一些选项,例如
    dodge=False,alpha=0.5
    在同一点绘制条形图。

    非常感谢!!!它工作得很好。还有一个问题,如果每个箱子的宽度不一样,比如[0250001000150025005000100000000,float('inf'),我该怎么办?在这种情况下,有意义的kde曲线缺少太多信息。而不是直方图,条形图更适合。我用一个额外的例子更新了答案。
    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    import numpy as np
    
    sns.set()
    bins = [0, 250, 500, 1000, 1500, 2500, 5000, 10000, 50000, np.inf]
    bin_labels = [f'{b0}-{b1}' for b0, b1, in zip(bins[:-1], bins[1:])]
    df = pd.DataFrame({'counts': np.random.randint(2, 30, 9),
                       'theoretical counts': np.random.randint(2, 30, 9)})
    df['theoretical counts'] = (3 * df['counts'] + df['theoretical counts']) // 4
    fig, ax = plt.subplots(figsize=(10, 4))
    sns.barplot(data=df.melt(), x=np.tile(bin_labels, 2), y='value',
                hue='variable', palette=['cornflowerblue', 'crimson'], ax=ax)
    plt.tight_layout()
    plt.show()