Python绘制直方图(Histograms)—从文件中读取数据画图update@2017-05-17

1.基本概念

1.1 直方图

在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维統計圖表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。

这里写图片描述





如果还是太抽象了,我们在来举一个例子

这里写图片描述 (figure 1)

其实,我记得这个是我们初中初三上课的内容,不知道各位同学有没有印象。哈哈哈,突然暴露了年龄,因为现在新教材是把这部分移动了到了高中的教材,是数学的必修三。哈哈哈,又暴露了职业。哟哟哟,切克闹~

看到上面这个直方图,统计的是身高从149cm~173cm的人数。
然后组距是3cm, 也就是我们将身高从149~173 的人平均分成了8组,然后每组的距离就是3cm.

通过看图1,我们可以发现,身高在149cm152cm这个范围内的人数是2个人。身高的范围从158cm161cm这个范围内的人数是19个人。

好的现在我们就是要用Python来画这个图。我比较喜欢Python,因为各种强大和方便。



1.2 频率分布直方图

reference from
http://baike.baidu.com/item/%E9%A2%91%E7%8E%87%E5%88%86%E5%B8%83%E7%9B%B4%E6%96%B9%E5%9B%BE

在直角坐标系中,横轴表示样本数据的连续可取数值,按数据的最小值和最大值把样本数据分为m组,使最大值和最小值落在开区间(a,b)内,a略小于样本数据的最小值,b略大于样本数据的最大值。组距为d=(b-a)/m,各数据组的边界范围按左闭右开区间,如[a,a+d),[a+d,a+2d),……[a+(m-1)d,b).纵轴表示频率除以组距(落在各组样本数据的个数称为频数,频数除以样本总个数为频率)的值,以频率和组距的商为高、组距为底的矩形在直角坐标系上来表示,由此画成的统计图叫做频率分布直方图。

如下图所示:
在这里插入图片描述



1.2.1基本概念

各组频率之和的值为1,在频率分布直方图中表现为所有矩形的面积之和等于1。 各组的平均频率密度是指组频率与组距的比值,是指该组内单位距离上的频率。以平均频率密度为纵坐标,取代频率分布直方图中的频率,所作的统计图称为平均频率密度直方图。 平均频率密度直方图中所有矩形的面积之和等于1.也就是平均频率密度直方图中所有矩形的顶边与直方图两边界边及横轴围成的图形的面积等于1. 当样本量不断增加而组距不断减小,每一组的平均频率密度就非常接近组中值处的频率密度,此时频率密度直方图的矩形顶边就非常接近一光滑曲线,该曲线就是频率密度函数曲线。简单来说:就是利用直方图反映样本的频率分布规律,这样的直方图称为频率分布直方图,简称频率直方图。

频率分布直方图能清楚显示各组频数分布情况又易于显示各组之间频数的差别。它主要是为了将我们获取的数据直观、形象地表示出来,让我们能够更好了解数据的分布情况,因此其中组距、组数起关键作用。分组过少,数据就非常集中;分组过多,数据就非常分散,这就掩盖了分布的特征。当数据在100以内时,一般分5~12组为宜。

从频率分布直方图可以估计出的几个数据:
众 数:频率分布直方图中最高矩形的底边中点的横坐标 。
算术平均数:频率分布直方图每组数值的中间值乘以频率后相加。
加权平均数:加权平均数就是所有的频率乘以数值后的和相加
中位数:把频率分布直方图分成两个面积相等部分的平行于Y轴的直线横坐标。

1.2.2 画直方图的步骤

1.找出所有数据中的最大值和最小值,并算出它们的差(极差)。
2.决定组距和组数。
3.确定分点。
4.将数据以表格的形式列出来。(列出频率分布)
5.画频数分布直方图(横坐标为样本资料、纵坐标是样本频率除以组距)。
与频率分布直方图相关的一种图为折线图。我们可以在直方图的基础上来画,先取直方图各矩形上边的中点,然后在横轴上取两个频数为0的点,这两点分别与直方图左右两端的两个长方形的组中值相距一个组距,将这些点用线段依次联结起来,就得到了频数分布折线直方图。


2.画图

在画图之前我们需要先安装matplotlib
安装的教程在下面:
http://matplotlib.org/users/installing.html

其实在Python的gallery库中已经给了我们很多的模板,我们可以直接 拿过来用。


2.1 从文件中读取数据画图

我们先讲一点教材上没有的。就是直接从文件中读取出数据,然后根据我们自己文件中的数据来直接画图。不是说了么,要写博客就要写一点别人没有写过的东西,至少呢,我是没有看到有人写这个部分,所以我就大方的分享了。哈哈,如果觉得有用你们要记得给我点个赞好么,拜托了。么么哒~


假设我们有一个csv的文件。
内容如下:

1205
522
46
277
879
1459
2525
1632
37
1945
534
1376
663
1376
1080
6404
224
135
317
1097
166
607
69
2260
882
299
8303
503
336
2919
149
367
897
405
241
218
532
310
1607
312
1696
4935
323
595

我们要从这个文件中读取数据然后,构建出我们的直方图。Histogram。

画图的步骤:

  • 我们讲数据从文件中读出来
  • 讲数据转换为数组
  • 画图

下面是每一步的详细画图步骤:

# 首先打开文件从文件中读取数据
f=open(Path) # path存储的是我们的目标文件所在的位置

# 我们先打开目标文件然后读取出这个文件中的每一行
lines = f.readlines()

# 创建一个函数用来读取数据

def get_data(lines): # 在这里lines = f.readlines()

    sizeArry=[] # 创建一个list,用来存储数据

    for line in lines:
        line = line.replace("\n","") 
        # 因为读出来的数据每一行都有一个回车符,我们要删除

        line = int(line)
	# 将其转换为整数
	
        sizeArry.append(line)
	#转换为numpy 可以识别的数组
	
    return array(sizeArry)

构建画频率直方图的步骤


def draw_hist(lenths):  #lenths 接受的其实是 sizeArry传来的数组 就是def get_data(lines) 返回的数据
    data = lenths 

# 对数据进行切片,将数据按照从最小值到最大值分组,分成20组
    bins = np.linspace(min(data),max(data),20)

# 这个是调用画直方图的函数,意思是把数据按照从bins的分割来画
    pl.hist(data,bins)
#设置出横坐标
    pl.xlabel('Number of ×××')
#设置纵坐标的标题
    pl.ylabel('Number of occurences')
#设置整个图片的标题
    pl.title('Frequency distribution of number of ×××')

# 展示出我们的图片
    pl.show()


完整的代码:

#!/usr/bin/env python
# coding=utf-8
# Author  : Chicho
# Function : draw the Histogram
# Date    : 2017-05-17

'''
引入必要的包
'''
import os
from numpy import array
import numpy as np
import pylab as pl

# the path store the file
# 这里假设有一个文件叫做test.csv 存储的是我们要画的数据
oriPath = "/home/chicho/test.csv"


# 创建一个函数用来读取数据
def get_data(lines):

    sizeArry=[]

    for line in lines:
        line = line.replace("\n","")

        line = int(line)

        sizeArry.append(line)

    return array(sizeArry)


# 首先打开文件从文件中读取数据
f=open(oriPath)
Lenths = get_data(f.readlines())




def draw_hist(lenths):
    data = lenths 

    bins = np.linspace(min(data),2000,20)

    pl.hist(data,bins)

    pl.xlabel('Number of ×××')

    pl.ylabel('Number of occurences')

    pl.title('Frequency distribution of number of ×××s')

    pl.show()



draw_hist(oriLenths)

update @ 2017-05-18

2.2 改变直方图的各种属性

我们使用Python来画图的时候默认的是每个直方图都用一条线隔开的,然后颜色是蓝色的,现在如果我们想要修改这个直方图的颜色以及其他的一些属性,我们现在就要说怎么来修改。

下面是色卡图,你想用什么颜色直接从里面来挑选就可以了

图片的来源:

http://matplotlib.org/examples/color/named_colors.html


这里写图片描述

我们画直方图用到的函数就是我们的 hist.

 matplotlib.pyplot.hist(  
    x, bins=10, range=None, normed=False,   
    weights=None, cumulative=False, bottom=None,   
    histtype=u'bar', align=u'mid', orientation=u'vertical',   
    rwidth=None, log=False, color=None, label=None, stacked=False,   
    hold=None, **kwargs)  

在这里我们只需要给我们的颜色按照颜色卡片上你喜欢的名字赋值就可以了。

我们来看Gallery 里面的例子

"""
================================================================
Demo of the histogram function's different ``histtype`` settings
================================================================

* Histogram with step curve that has a color fill.
* Histogram with custom and unequal bin widths.

Selecting different bin counts and sizes can significantly affect the
shape of a histogram. The Astropy docs have a great section on how to
select these parameters:
http://docs.astropy.org/en/stable/visualization/histogram.html
"""

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

mu = 200
sigma = 25
x = np.random.normal(mu, sigma, size=100)

fig, (ax0, ax1) = plt.subplots(ncols=2, figsize=(8, 4))

ax0.hist(x, 20, normed=1, histtype='stepfilled', facecolor='g', alpha=0.75)
ax0.set_title('stepfilled')

# Create a histogram by providing the bin edges (unequally spaced).
bins = [100, 150, 180, 195, 205, 220, 250, 300]
ax1.hist(x, bins, normed=1, histtype='bar', rwidth=0.8)
ax1.set_title('unequal bins')

fig.tight_layout()
plt.show()

在这里设置的是第一个图片是绿色 facecolor=‘g’

这里写图片描述


写在后面的话

喜欢的话救救孩子吧~

在这里插入图片描述

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程 https://www.cbedai.net/chichoxian


好的,今天先分享到这里,我们有时间在说其他的。


这里写图片描述







  • 69
    点赞
  • 313
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值