如何使用Matplotlib标准化直方图?

时间:2018-11-18 10:20:20

标签: python numpy matplotlib histogram seaborn

我正在尝试使用matplotlib生成直方图。我正在从以下文件读取数据: https://github.com/meghnasubramani/Files/blob/master/class_id.txt

我的意图是生成具有以下bin的直方图:1、2-5、5-100、100-200、200-1000,> 1000。

当我生成图形时,它看起来不太好。 我想将y轴归一化为(bin中的出现频率/总项)。我尝试使用density参数,但每当尝试使图形最终完全空白时。我该怎么做。

即使仓位范围变化,如何使条形的宽度相同?

是否还可以在直方图上指定刻度?我想让刻度线对应于bin范围。

Graph

import matplotlib.pyplot as plt

FILE_NAME = 'class_id.txt'
class_id = [int(line.rstrip('\n')) for line in open(FILE_NAME)]
num_bins = [1, 2, 5, 100, 200, 1000, max(class_id)]
x = plt.hist(class_id, bins=num_bins, histtype='bar', align='mid', rwidth=0.5, color='b')
print (x)
plt.legend()
plt.xlabel('Items')
plt.ylabel('Frequency')

1 个答案:

答案 0 :(得分:0)

最重要的建议是,我们可以使用条形图来绘制分类数据,并且需要对bin中的值进行分类,例如对于熊猫:

import matplotlib.pyplot as plt
import pandas

FILE_NAME = 'class_id.txt'
class_id_file = [int(line.rstrip('\n')) for line in open(FILE_NAME)]

num_bins = [0, 2, 5, 100, 200, 1000, max(class_id_file)]
categories = pandas.cut(class_id_file, num_bins)
df = pandas.DataFrame(class_id_file)
dfg = df.groupby(categories).count()
bins_labels = ["1-2", "2-5", "5-100", "100-200", "200-1000", ">1000"]

plt.bar(range(len(categories.categories)), dfg[0]/len(class_id_file), tick_label=bins_labels)
#plt.bar(range(len(categories.categories)), dfg[0]/len(class_id_file), tick_label=categories.categories)

plt.xlabel('Items')
plt.ylabel('Frequency')

Bar chart with categorical data

不是您要的,但是您也可以保持直方图并选择对数刻度以提高可读性:

plt.xscale('log')