
最右边的数据看不清楚,但是确实存在,只是数据太小了。这时候我们使用log参数,让程序自动调整y轴的尺度:


这样在不同的尺度上所有的数据都可以很清晰的看到。
源码:
# coding=utf-8
from matplotlib import pyplot as plt
import pandas as pd
plt.style.use('fivethirtyeight')
'''
# 表示我们要分类的所有横轴上的数据(纵轴将是每个区间[任意指定]内横轴数据出现的数量)
ages = [18, 19, 21, 25, 26, 26, 30, 32, 38, 45, 55]
# hist方法可以创建直方图, 重要的参数有bins, edgecolor, log 等
# bins可以是一个整数(将所有数据平均分成这个整数这么多段[所有区间]); 也可以是一个可迭代对象, hist会根据给定的对象来划分区间.
# edgecolor可以指定每个区间之间分割线的颜色, 如果制定了edgecolor会很清晰的分辨出各个区间.
# log是当你的数据集"差异"较大时,也就是说有个别"突出"数据远离平均数据,这样最后的结果很可能会"看不清"这些边缘数据,\
# 这时使用log=True可以很好的解决,hist会自动帮你选定划分数据的尺度,以让所有数据都清晰的在图里显示出来.
plt.hist(ages, bins=5, edgecolor='#444444')
'''
# 人为的指定区间, 区间数量是len(slices)-1
slices = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
# 从数据集csv文件中读取数据
data = pd.read_csv('./data_3.csv')
# 取出csv文件所有列名为Age的值并返回一个可迭代对象
data_ages = data['Age']
# 绘制直方图,分割区间人为指定, 边缘颜色黑色, hist自动选定竖轴尺度
plt.hist(data_ages, bins=slices, edgecolor='#444444', log=True)
# 求出数据集年龄的平均值
median_age = data_ages.median()
# 绘制vertical(竖直)分割线以表示平均值, 颜色是红色, 标签是Age Median, 线宽设置为2
plt.axvline(median_age, color='#fc4f30', label='Age Median', linewidth=2)
# 必须要有legend标签才会绘制出去
plt.legend()
# 求出直方图在竖轴上最大值和最小值
y_min, y_max = plt.ylim()
# 在平均线靠右边一点绘制平均值的文本, 前两个参数是位置, 最后一个参数是待绘制的文本
plt.text(median_age * 1.05, y_max * 0.7,
'Mean: {:.1f}'.format(median_age), color='#fc4f30')
plt.title('First histograms')
plt.xlabel('ages')
plt.ylabel('number of a specific range')
plt.tight_layout()
plt.show()
运行结果:


网友评论