等频分箱实现的自动生成单组数据频率直方图

def draw_histogram(rawdata):
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    bins = np.histogram(rawdata)
    bin_list = [float(format(x, '.1f')) for x in bins[1]]
    if(len(bin_list)==0):
        return
    if (bin_list[0] != 0 and bin_list[0]!=0.0 ):
        bin_list.insert(0, 0)
    split_str = []
    for i in range(len(bin_list)):
        if (i < len(bin_list) - 1):
            split_str.append(str(bin_list[i]) + '~' + str(bin_list[i + 1]))
        else:
            break
    # 制作频数分布表
    # 分割区间 前n后n-1
    data_split = pd.cut(rawdata, bin_list,labels=split_str)
    # 计算每个区间的频数并按上面的labels调整顺序
    freq_chart = data_split.value_counts()
    freq_chart = freq_chart.sort_index()
    # 保存为一个频率分布字典
    freq_dict = {'section': freq_chart.index, 'frequency': freq_chart.values}
    # 将对应的频率分布字典转化为pd文件
    freq_data = pd.DataFrame(freq_dict)

    ax = plt.figure(figsize=(int(len(bin_list)*4),int(len(bin_list)*2))).add_subplot(111)
    sns.barplot(x="section", y="frequency", data=freq_data, palette="Set3")  # palette设置颜色
    # 设置y轴高度 y轴高度最好为最大都轴超20%
    ax.set_ylim([0, max(freq_data['frequency']) + int(max(freq_data['frequency']) * 0.2)])
    ax.set_title('频数分布图', size=40)
    # 设置字体大小
    plt.xticks(fontsize=30)
    plt.yticks(fontsize=30)
    # 设置数据标签
    for x, y in zip(range(len(bin_list)), freq_data.frequency):
        ax.text(x, y, '%d' % y, ha='center', va='bottom', fontsize=30, color='grey')
    plt.show()

调用方法

rawdata = pd.read_csv("./data/Ar_tpm.tsv", sep='\t')
print(rawdata.describe())
rawdata = rawdata['Ar_tpm']

draw_histogram(rawdata)

posted @ 2021-08-09 20:07  她与我的点点滴滴  阅读(176)  评论(0)    收藏  举报