我正在尝试使用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范围。
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')
答案 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')
不是您要的,但是您也可以保持直方图并选择对数刻度以提高可读性:
plt.xscale('log')