频率图与matplotlib

我正在尝试使用matplotlib在Python中自动化频率图来计算出现次数,而不是必须在Excel中手动绘图。 但是,我不能像我在Excel中所做的那样创build类似于图表的类似图表。 Matplotlib可以吗?

在Excel中:

在这里输入图像说明

码:

#!/usr/bin/python import numpy as np import matplotlib.pyplot as plt from numpy import * import os import sys import csv from random import randint x = [6,0,0,26,0,0,0,0,5,0,7,0,12,12,0,0,0,3,0,5,5,0,10,4,3,5,1,0,2,0,0,1,0,8,0,3,7,1,0,0,0,1,1,0,0,0,0,0,7,16,0,0,0,5] plt.hist(x) plt.title("Frequency diagram") plt.xlabel("Value") plt.ylabel("Frequency") plt.show() 

结果(与Excel相比,可读性不如以前,我怎样才能使它与Excel图相似):

在这里输入图像说明

 import numpy as np import matplotlib.pyplot as plt def make_hist(ax, x, bins=None, binlabels=None, width=0.85, extra_x=1, extra_y=4, text_offset=0.3, title=r"Frequency diagram", xlabel="Values", ylabel="Frequency"): if bins is None: xmax = max(x)+extra_x bins = range(xmax+1) if binlabels is None: if np.issubdtype(np.asarray(x).dtype, np.integer): binlabels = [str(bins[i]) if bins[i+1]-bins[i] == 1 else '{}-{}'.format(bins[i], bins[i+1]-1) for i in range(len(bins)-1)] else: binlabels = [str(bins[i]) if bins[i+1]-bins[i] == 1 else '{}-{}'.format(*bins[i:i+2]) for i in range(len(bins)-1)] if bins[-1] == np.inf: binlabels[-1] = '{}+'.format(bins[-2]) n, bins = np.histogram(x, bins=bins) patches = ax.bar(range(len(n)), n, align='center', width=width) ymax = max(n)+extra_y ax.set_xticks(range(len(binlabels))) ax.set_xticklabels(binlabels) ax.set_title(title) ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) ax.set_ylim(0, ymax) ax.grid(True, axis='y') # http://stackoverflow.com/a/28720127/190597 (peeol) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.spines['left'].set_visible(False) # http://stackoverflow.com/a/11417222/190597 (gcalmettes) ax.xaxis.set_ticks_position('none') ax.yaxis.set_ticks_position('none') autolabel(patches, text_offset) def autolabel(rects, shift=0.3): """ http://matplotlib.org/1.2.1/examples/pylab_examples/barchart_demo.html """ # attach some text labels for rect in rects: height = rect.get_height() if height > 0: plt.text(rect.get_x()+rect.get_width()/2., height+shift, '%d'%int(height), ha='center', va='bottom') x = [6,0,0,26,0,0,0,0,5,0,7,0,12,12,0,0,0,3,0,5,5,0,10,4,3,5,1,0,2,0,0,1,0,8,0, 3,7,1,0,0,0,1,1,0,0,0,0,0,7,16,0,0,0,5,41] fig, ax = plt.subplots(figsize=(14,5)) # make_hist(ax, x) # make_hist(ax, [1,1,1,0,0,0], extra_y=1, text_offset=0.1) make_hist(ax, x, bins=list(range(10))+list(range(10,41,5))+[np.inf], extra_y=6) plt.show() 

在这里输入图像说明

make_hist尝试识别x中的所有值是否是整数。 如果是这样,它使用基于整数的bin标签。 例如,箱标签10-14表示范围[10, 14] 10-14 [10, 14] (含)。

另一方面,如果x包含浮点数,那么make_hist将使用半打开的基于浮点的bin标号。 例如, 10-15代表半开范围[10, 15)

Matplotlib不支持样式。 你可能更喜欢ggplot风格:

 plt.style.use('ggplot') 

还有很多其他的预制风格,或者你可以创build自己的: http : //matplotlib.org/users/style_sheets.html