摘要:先介绍条形图直方图,然后用随机数生成一系列数据,保存到列表中,最后统计出相关随机数据的概率并展示

前述介绍了由点进行划线形成的拆线图和散点形成的曲线图,连点成线,主要用到了matplotlib中的plot()和scatter()这个函数,但在实际生活工作中,不仅有折线图,还经常会出现月份经济数据对比图,身高统计图等,制成图表就很容易对比看出差异。

下面用matplotlib中bar()函数和hist()来实现条形图和直方图。

一、bar()函数

bar()函数的最主要的几个参数如下:

bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
参数1:x : 标量型,x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组
参数2:height:y轴上的坐标。浮点数或类数组结构
参数3:width:指定柱形图的宽度。浮点数或类数组结构。默认值为0.8
参数4:bottom:标量或标量类数组型,y坐标的起始高度
参数5:align:柱状图在x轴上的对齐方式,可选{‘center’, ‘edge’} center:中心对称 edge:边缘对称
参数6:**kwargs:接收的关键字参数传递给关联的Rectangle。 返回值:BarContainer实例,其patches属性是柱体的列表

条形图(柱状图)一个简单的示例,随便设置12个月份,并给定某些数据,代码如下:

plt.bar([1,2,3,4,5,6,7,8,9,10,11,12,13],[5,2,7,8,2,1,8,6,2,5,6,7,10], label="Test one", color='red') #x位置上数列[1,2,3,4,5,6,7,8,9,10,11,12,13],表示为相对y轴,柱状图在X轴的位置,后面一列为对应y轴的高度。
plt.legend() #运行结果里图例名称显示出来
plt.xlabel('bar number') 
plt.ylabel('bar height')
plt.title('TEST')
plt.show()

第一列中的color=‘red’表示柱状图全部显示为红,为显示区别,做以下修改:

import matplotlib.pyplot as plt  

plt.bar([1,3,5,7,9,11],[5,7,8,6,7,10], label="Test one", color='#202204')
plt.bar([2,4,6,8,10,12],[8,6,2,5,6,7], label="Test two", color='g') # color也可是16进制,如上显示的 #202204
plt.legend() #运行结果里图例名称显示出来
plt.xlabel('bar number')
plt.ylabel('bar height')
plt.title('TEST')
plt.show()

具体显示结果如下:

二,hist()函数

hist(x,bins=None,range=None,density=None,weights=None,cumulative=False,bottom=None,histtype=“bar”, align=“mid”,orientation=“vertical”,rwidth=None,log=False,color=None,label=None,stacked=False,normed=None, hold=None,data=None,**kwargs)

hist()函数的基础参数如下:

x :表示输入值,可以是单个数组,或者不需要相同长度的数组序列。
bins:表示绘制条柱的个数。若给定一个整数,则返回 “bins+1” 个条柱,默认为10。
range:bins的上下范围(最大和最小值)。
color:表示条柱的颜色,默认为None。
facecolor #直方图颜色
edgecolor #直方图边框颜色
alpha # 透明度
histtype #直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
orientation # 水平或垂直方向
rwidth #柱子与柱子之间的距离,默认是0

下面通过一个例子来说明hist()函数的作用:

import matplotlib.pyplot as plt  

population_ages = [18,34,23,56,32,45,78,23,45,12,31,25,61,27,34,57,54,26,45,37,36,8,14,17,13,88,99,49,63,105,121,116] #设定一组年龄

bins = [0,10,20,30,40,50,60,80,90,100,130]  #年龄分段

plt.hist(population_ages, bins, histtype='bar', rwidth=0.8,color='#199209')

plt.xlabel('The Age Group')
plt.ylabel('The number')
plt.title('The Age Range')
plt.legend()
plt.show()

注意:bins[]中60,80和100,130中间缺少是故意为之,为了显示区别

运行结果如下:

很明显,hist()函数会自动根据参数bins中的区分将参数x中的数据自动进行统计。

搞事情,既然参数x(如例子中的population_ages)可能是数列,那能否用随机函数自动生成数组,然后在进行统计呢?当然可以。

三、数据统计

色子经常用来娱乐(用作他途造成后果与我无关),它有6个面,分别点数为1,2,3,4,5,6,可利用随机函数(上篇中的choice函数)来随机产生,比如choice([1,2,3,4,5,6]),产生N次(比如20万次)并将每次结果保存到列表中,最后统计出各点的总数或所点比例。

分析:

1)先建一个类,其功能就是运行一次,就随机选择6个面(点数)

2)将色子实例化,并给定一个参数(运行的次数),图形化显示出来。

class Sezi():
def __init__(self,sides):#给自身定义一个面数,方便后面修改参数进行其他操作
self.sides = sides #色子可以是6面,也可以是8面,10面,12面,需要给定
def roll(self):
return choice([1,2,3,4,5,6])#每投一次,随机选择一个点数 testsezi = Sezi(6) #实例化,6个面
results = [] # 定义一个空的数列,用来保存每次投掷的点数
for roll_num in range(100): #循环,投100次
result = testsezi.roll() #将每次投掷结果保存到变量result中
results.append(result) #存入到数列results
print(results) #直接打印出来

运行结果:

与此同时,为了后面方便,引入另一个随机函数randint(x, y),这个函数的作用是产生x-y之间的数字,比如randint(1,10),就产生1到10之间的数字。

choice([1,2,3,4,5,6])可以修改为randint(1,self.sides),这样实例化后,需要输入随意一个面数,就会随机产生对应的数字。
上述还只是打印在交互栏,且类、实例还是在一个文件中,分成不同的文件,并数据统计用图的形式显示。
1,重新修改色子类
文件名sezi.py,里面代码如下:
from random import *

class Sezi():
def __init__(self,sides):#给自身定义一个面数,面数对应点数
self.sides = sides #色子可以是6面,也可以是8面,10面,12面,需要给定
self.side=0
self.bins=[] while self.side < self.sides: #获取面数,并得到一个面数的bins,可直接调用。
self.side += 1
self.bins.append(self.side) def roll(self):
return randint(1,self.sides)#每投一次,随机选择一个点数

2、新建一个名称sezigame.py的文件,代码如下

import matplotlib.pyplot as plt
from sezi import * testsezi = Sezi(8) #实例化,8个点
results = [] # 定义一个空的数列,用来保存每次投掷的点数 for roll_num in range(50000): #循环,投50000次
result = testsezi.roll() #将每次投掷结果保存到变量result中
results.append(result) #存入到数列results plt.hist(results, testsezi.bins, histtype='bar', rwidth=0.8,color='#199209') #直接调用testsezi.bins

运行结果:

如果有2个相同的色子呢?

同时掷两个骰子,最小为2,最大为12,结果分布情况自然也就不同。

将名称sezigame.py的文件修改,改动后的代码如下:

import matplotlib.pyplot as plt
from sezi import * sezi_1 = Sezi(6) #实例化,6个面
sezi_2 = Sezi(6) results = [] # 定义一个空的数列,用来保存每次投掷的点数
for roll_num in range(50000): #循环,投50000次
result = sezi_1.roll()+sezi_2.roll() #将两次投掷结果保存到变量result中
results.append(result) #存入到数列results max_result = sezi_1.sides+sezi_2.sides #2个最大值为12,最小为2
side = 0
new_bins = []
while side <= max_result:
side += 1
new_bins.append(side) plt.xlabel('The sides')
plt.ylabel('The numbers')
plt.title('The frequency')
plt.hist(results,new_bins, histtype='bar',color='#199209',rwidth=0.618)

运行结果如下:

是不是有点正态分布的感觉了?

python数据处理-matplotlib入门(4)-条形图和直方图的更多相关文章

  1. python数据处理matplotlib入门(2)-利用随机函数生成变化图形

    综合前述的类.函数.matplotlib等,完成一个随机移动的过程(注意要确定移动的次数,比如10万次),每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策确定的,最后显示出每次移动的位置 ...

  2. python数据处理-matplotlib入门(2)-利用随机函数生成变化图形2

    鉴于上一篇中最后三个问题: 1.上述程序是否能进行优化(比如功能相同的) 2.创建三个3个实例,用了3个语句,能否建一个函数,只输入一个数n,就自动创建n个实例?同时,每个实例的num_times随机 ...

  3. Matplotlib散点图、条形图、直方图-02

    对比常用统计图 折线图: 特点:能够显示数据的变化趋势,反映事物的变化情况.(变化) 直方图: 特点:绘制连续性的数据,展示一组或者多组数据的分布情况(统计) 条形图: 特点:绘制离散的数据,能够一眼 ...

  4. python Matplotlib 系列教程(三)——绘制直方图和条形图

    在本章节我们将学习如何绘制条形图和直方图 条形图与直方图的区别:首先,条形图是用条形的长度表示各类别频数的多少,其宽度(表示类别)则是固定的: 直方图是用面积表示各组频数的多少,矩形的高度表示每一组的 ...

  5. matplotlib常见绘图基础代码小结:折线图、散点图、条形图、直方图、饼图

    一.折线图 二.散点图 三.条形图 四.直方图 五.饼图 一.折线图折线图用于显示随时间或有序类别的变化趋势 from matplotlib import pyplot as plt x = rang ...

  6. python之 matplotlib模块之基本三图形(直线,曲线,直方图,饼图)

    matplotlib模块是python中一个强大的绘图模块 安装 pip  install matplotlib 首先我们来画一个简单的图来感受它的神奇 import numpy as np impo ...

  7. 【Matplotlib-01】Python 绘图库 Matplotlib 入门教程

    环境: Windows10 python3.6.4 numpy1.14.1 matplotlib2.1.2 工具:Cmder 目录: 1.线性图 2.散点图 3.饼状图 4.条形图 5.直方图 例1: ...

  8. Python 数据处理库 pandas 入门教程

    Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...

  9. Python 绘图库Matplotlib入门教程

    0 简单介绍 Matplotlib是一个Python语言的2D绘图库,它支持各种平台,并且功能强大,能够轻易绘制出各种专业的图像. 1 安装 pip install matplotlib 2 入门代码 ...

随机推荐

  1. SpringMVC怎么样设定重定向和转发的?

    (1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4" (2)重定向:在返回值前面加"red ...

  2. 阐述final、finally、finalize的区别?

    - final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词.将变量声明为final,可以保证它们在使用中不被 ...

  3. 说说do...while和while的区别

    一.do-while语句 do-while语句的语法: do{ statement }while(expression); 看下面示例: var i=10: do{ i+=2: }while(i< ...

  4. Zookeeper 的 java 客户端都有哪些?

    java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator.

  5. 学习Apache(四)

    介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...

  6. 【leetcode 29】 两数相除(中等)

    题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数 ...

  7. USB与电池切换电路图

  8. HTML5中dialog元素尝鲜

    对话框(别称模态框,浮层)是web项目中用于用户交互的重要部分,我们最常见的就是js中 alert(),confirm(),但是这个对话框的不美观,也不能自定义样式,所以在开发的过程中,一般根据自己自 ...

  9. python-人物风云榜(实现排名)

    Description 又到了云之国一年一度的任务风云榜更新的大日子了.给出每个人风云力数值,需要你给出每个人的排名.注意,排名存在并列的情况. Input 一共有 22 行.第一行一个整数 n ,表 ...

  10. Python pip下载慢的解决方法

    国外的源下载速度实在是太慢了 可以使用国内的一些镜像网站安装 使用cmd命令 格式:pip install -i 网站 库 例如: 国内的一些镜像网站 清华大学:https://pypi.tuna.t ...