Python万能模板案例之matplotlib绘制直方图的基本配置


Posted in Python onApril 13, 2022

直方图介绍

直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。

直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。

为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。

直方图也可以被归一化以显示“相对”频率。 然后,它显示了属于几个类别中的每个案例的比例,其高度等于1。

绘制直方图的参数(plt.hist())

Python万能模板案例之matplotlib绘制直方图的基本配置

通常而言,绘制直方图有很多种方法,比如采用matplotlib里面的模块进行绘制,也可以是pandas里面的图形进行绘制,也可以使用Python里面其他的统计绘图模块进行绘制图形,总而言之,想要图形展示的美观,那么就需要自己配置,也就是说模板固然重要,但是如果不懂原理的进行搬运和借用,反而效果不是很好!

连接数据库进行直方图绘制案例

# -*- coding: utf-8 -*-
 
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties 
mpl.rcParams['font.sans-serif']=['SimHei']     #显示中文
plt.rcParams['axes.unicode_minus']=False       #正常显示负号
 
import pymysql
 
 
#连接MySQL数据库
v1 = []
v2 = []
db = pymysql.connect(host='127.0.0.1', port=3306, database='mydb',user='root',password='root')
cursor = db.cursor()
 
#读取订单表数据,统计每日利润额
sql_str = "SELECT order_date,ROUND(SUM(profit)/10000,2) FROM orders WHERE FY=2019 GROUP BY order_date"
cursor.execute(sql_str)
result = cursor.fetchall()
for res in result:
    v1.append(res[0])  # order_date
    v2.append(res[1])  # sum_profit_by_order_date 每日利润额
 
plt.figure(figsize=(10,5))         #设置图形大小
cs,bs,bars = plt.hist(v2, bins=20, density=False, facecolor="cyan", edgecolor="black", alpha=0.7)
width = bs[1]-bs[0]
for i,c in enumerate(cs):
    plt.text(bs[i]+width/3,c,round(c))
 
# 返回一个counts数组,一个bins数组和一个图形对象
# 显示横轴标签
plt.xlabel("区间",fontdict={'family':'Fangsong','fontsize':15})
# 显示纵轴标签
plt.ylabel("频数",fontdict={'family':'Fangsong','fontsize':15})
# 显示图标题
plt.title("利润额分布直方图",fontdict={'family':'Fangsong','fontsize':20})
plt.show()

使用dataframe里面的plot函数进行绘制(万能模板)

一般而言,我们导入数据的时候,大概率都是基于表数据进行可视化的,很少使用那些自主独立的数据进行绘制,如果是那种数据,很多人都会去使用origin这个绘图软件了,程序绘图最大的好处就是不需要对数据结果进行输出,输入,这样在很大程度上减少了我们的时间,提高了我们的工作效率。

# 使用DataFrame的plot函数画图
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties 
mpl.rcParams['font.sans-serif']=['SimHei']     #显示中文
plt.rcParams['font.sans-serif'] = 'KaiTi' # 设置全局字体为中文 楷体
plt.rcParams['axes.unicode_minus']=False       #正常显示负号
plt.figure(dpi=130)
datafile = r'../data/orders.csv'
data = pd.read_csv(datafile).query("FY==2019").groupby('ORDER_DATE')[['PROFIT']].sum()
data.plot(kind='hist',bins=20,figsize=(15,5),color='y',alpha=0.5,edgecolor='c',histtype='bar')
 
 
plt.xlabel("区间",fontdict={'family':'Fangsong','fontsize':15})
plt.ylabel("频数",fontdict={'family':'Fangsong','fontsize':15})
plt.title("利润额分布直方图",fontdict={'family':'Fangsong','fontsize':20},y=1.03)
 
# 设置图形上的各类主题值
plt.suptitle('直方图案例',size=22,y=1.05)
plt.title("绘制日期:2022年   昵称:王小王-123", loc='right',size=12,y=1.03)
 
plt.title("主页:https://blog.csdn.net/weixin_47723732", loc='left',size=12,y=1.03)
 
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

绘制多个子图(多子图直方图案例模板)

plt.tight_layout() # 自动紧凑布局,避免遮挡

是很重要的一个参数,一般是在结尾出添加这个参数

import pandas as pd
 
datafile = r'../data/orders.csv'
data = pd.read_csv(datafile).query("FY==2019").groupby('ORDER_DATE')[['PROFIT']].sum()
 
fig = plt.figure(figsize=(10,5),dpi=130)  # 生成画布
 
# 生成子图1
ax1 = plt.subplot(121)  # 1行2列中的第1个
plt.title("CSDN博客专家", loc='left',size=12,y=1.03) #添加备注
 
# 生成子图2
ax2 = plt.subplot(122)  # 1行2列中的第2个
 
# 设置图形上的各类主题值
plt.title("王小王-123", loc='right',size=12,y=1.03)#添加备注
 
 
#df.plot使figure级别的绘图函数,默认会生成新的figure,可以通过ax参数指定绘图的坐标子图
data.plot(kind='hist',bins=20,color='c',alpha=0.5,edgecolor='c',histtype='bar',ax=ax1,figure=fig)  # 指定这个图画到ax1中
#plt.xlabel("区间",fontdict={'family':'Fangsong','fontsize':15})
ax1.set_xlabel("区间",fontdict={'family':'Fangsong','fontsize':15})
#plt.ylabel("频数",fontdict={'family':'Fangsong','fontsize':15})
ax1.set_ylabel("频数",fontdict={'family':'Fangsong','fontsize':15})
ax1.set_title("cyan")
#print(ax1.get_xticks())
 
data.plot(kind='hist',bins=20,color='y',alpha=0.5,edgecolor='y',histtype='bar',ax=ax2,figure=fig) # 指定这个图画到ax2中
# plt.xlabel = plt.gca().set_xlabel()  plt. 获取“当前”的坐标子图,需要小心执行的位置
plt.xlabel("区间",fontdict={'family':'Fangsong','fontsize':15})
plt.ylabel("频数",fontdict={'family':'Fangsong','fontsize':15})
plt.title("yellow")                                                        # subplot的标题
 
plt.suptitle("利润额分布直方图",fontdict={'family':'Fangsong','size':22})  # figure的标题
plt.tight_layout() # 自动紧凑布局,避免遮挡
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

概率分布直方图(统计图形)

# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
 
#概率分布直方图
#高斯分布
#均值为0
mean = 0
#标准差为1,反应数据集中还是分散的值
sigma = 1
x=mean+sigma*np.random.randn(10000)
fig,(ax0,ax1) = plt.subplots(nrows=2,figsize=(9,6))
#第二个参数是柱子宽一些还是窄一些,越大越窄越密
ax0.hist(x,40,density=1,histtype='bar',facecolor='yellowgreen',alpha=0.75)  # histtype返回一组bar的数组
##pdf概率分布图,一万个数落在某个区间内的数有多少个
ax0.set_title('pdf')
ax1.hist(x,20,density=1,histtype='stepfilled',facecolor='pink',alpha=0.75,cumulative=True,rwidth=0.8) # 返回的一条step线,cumulative=True数值的累积的
#cdf累计概率函数,cumulative累计。比如需要统计小于5的数的概率
ax1.set_title("cdf")
fig.subplots_adjust(hspace=0.4)
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

直方图内显示折线图分布

import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif']=['SimHei']     #显示中文
plt.rcParams['font.sans-serif'] = 'KaiTi' # 设置全局字体为中文 楷体
plt.rcParams['axes.unicode_minus']=False       #正常显示负号
plt.figure(figsize=(17,8),dpi=120)
 
import numpy as np
from scipy.stats import norm
np.random.seed(10680801)
mu=100
sigma=15
x=mu+sigma*np.random.randn(500)
num_bins=60
fig,ax=plt.subplots()
#fig,ax=plt.subplots(ncols=2)
#ax1 = ax[0]
#ax2 = ax[1]
n,bins,patches=ax.hist(x,num_bins,density=True)
y=norm.pdf(bins,mu,sigma)
ax.plot(bins,y,'--')
ax.set_xlabel('IQ')
ax.set_ylabel('概率密度')
ax.set_title(r'智商分布情况直方图')
fig.tight_layout()

Python万能模板案例之matplotlib绘制直方图的基本配置

堆叠面积直方图

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
crime=pd.read_csv(r"http://datasets.flowingdata.com/crimeRatesByState2005.csv")
fig,ax=plt.subplots()
 
ax.hist(crime["robbery"],bins=12,histtype="bar",alpha=0.6,label="robbery",stacked=True)
ax.hist(crime["aggravated_assault"],bins=12,histtype="bar",alpha=0.6,label="aggravated_assault",stacked=True)
ax.legend()
ax.set_xticks(np.arange(0,721,60))
ax.set_xlim(0,720)
ax.set_yticks(np.arange(0,21,4))
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

在不同的子图中绘制各种类犯罪数据的数值分布

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
crime=pd.read_csv(r"http://datasets.flowingdata.com/crimeRatesByState2005.csv")
 
crime = crime.query("state!='United States'").query("state!='District of Columbia'")
 
plt.figure(figsize=(10,5),dpi=120)
nrows=2
ncols=4
n = np.arange(nrows*ncols)+1
for i in n:
    ax = plt.subplot(nrows,ncols,i)
    ax.hist(crime.iloc[:,i])
    ax.set_title(crime.columns[i])
 
plt.suptitle("各种类犯罪数据的数值分布",y=1.02)
plt.tight_layout()

Python万能模板案例之matplotlib绘制直方图的基本配置

 其他案例

乘客年龄分布频数直方图

# 导入第三方库
import pandas as pd
import matplotlib.pyplot as plt
 
# 设置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
 
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
 
# 准备数据(读取Titanic数据集)
titanic = pd.read_csv(r'E:\PythonData\exercise_data\train.csv')
 
# 检查年龄是否有缺失
any(titanic.Age.isnull())
 
# 删除含有缺失年龄的观察
titanic.dropna(subset=['Age'], inplace=True)
 
# 绘图:乘客年龄的频数直方图
plt.hist(titanic.Age, # 绘图数据
        bins = 20, # 指定直方图的条形数为20个
        color = 'steelblue', # 指定填充色
        edgecolor = 'k', # 设置直方图边界颜色
        label = '直方图'
        )# 为直方图呈现标签
 
# 刻度设置
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
 
# 添加描述信息
plt.xlabel('年龄:岁',fontsize=20)
plt.ylabel('人数:个',fontsize=20)
plt.title('乘客年龄分布',fontsize=20)
 
# 显示图形
plt.show()

 Python万能模板案例之matplotlib绘制直方图的基本配置

男女乘客直方图(二维数据)

 设置了组距和其他的参数

# 导入库
import matplotlib.pyplot as plt
import numpy as np
 
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
 
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
 
# 提取不同性别的年龄数据
age_female = titanic.Age[titanic.Sex == 'female']
age_male = titanic.Age[titanic.Sex == 'male']
 
# 设置直方图的组距
bins = np.arange(titanic.Age.min(), titanic.Age.max(), 2)
 
# 男性乘客年龄直方图
plt.hist(age_male, bins = bins, label = '男性',edgecolor = 'k', color = 'steelblue', alpha = 0.7)
 
# 女性乘客年龄直方图
plt.hist(age_female, bins = bins, label = '女性',edgecolor = 'k', alpha = 0.6,color='r')
 
# 调整刻度
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
 
# 设置坐标轴标签和标题
plt.title('男女乘客年龄直方图',fontsize=20)
plt.xlabel('年龄',fontsize=20)
plt.ylabel('人数',fontsize=20)
 
# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
 
# 显示图例
plt.legend(loc='best',fontsize=20)
 
# 显示图形
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

 电影时长分布直方图

# 导入库
import matplotlib.pyplot as plt
 
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
 
# 创建图形
plt.figure(figsize=(20,8),dpi=80)
 
# 准备数据
time=[131,98,125,131,124,139,131,117,128,108,135,138,131,102,107,114,119,128,121,142,127,130,124,101,110,116,117,110,128,128,115,99,136,126,
   134,95,138,117,111,78,132,124,113,150,110,117,86,95,144,105,126,130,126,130,126,116,123,106,112,138,123,86,101,99,136,123,117,119,105,
   137,123,128,125,104,109,134,125,127,105,120,107,129,116,108,132,103,136,118,102,120,114,105,115,132,145,119,121,112,139,125,138,109,
   132,134,156,106,117,127,144,139,139,119,140,83,110,102,123,107,143,115,136,118,139,123,112,118,125,109,119,133,112,114,122,109,106,
   123,116,131,127,115,118,112,135,115,146,137,116,103,144,83,123,111,110,111, 100,154,136,100,118,119,133,134,106,129,126,110,111,109,
   141,120,117,106,149,122,122,110,118,127,121,114,125,126,114,140,103,130,141,117,106,114,121,114,133,137,92,121,112,146,97,137,105,98,
   117,112,81,97,139,113,134,106,144,110,137,137,111,104,117,100,111,101,110,105,129,137,112,120,113,133,112,83,94,146, 133,101,131,116,
   111, 84,137,115,122,106,144,109,123,116,111,111,133,150]
# 设置组距
bins=2
 
groups = int((max(time)-min(time))/bins)
 
# 绘制直方图
plt.hist(time,groups,color='b',
            edgecolor = 'k',
        density = True) # 指定直方从图的边界色)
 
# 调整刻度
plt.xticks(list(range(min(time),max(time)))[::2],fontsize=15)
plt.yticks(fontsize=15)
 
# 添加描述信息
plt.xlabel('电影时长:分钟',fontsize=20)
plt.ylabel('电影数量占比',fontsize=20)
 
# 增加网格
plt.grid(True,linestyle='--',alpha=1)
 
# 添加标题
plt.title('电影时长分布直方图',fontsize=20)
 
plt.show()

Python万能模板案例之matplotlib绘制直方图的基本配置

到此这篇关于matplotlib绘制直方图的基本配置(万能模板案例)的文章就介绍到这了!

Python 相关文章推荐
使用python搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
python访问sqlserver示例
Feb 10 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
pandas将DataFrame的列变成行索引的方法
Apr 10 Python
python 平衡二叉树实现代码示例
Jul 07 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
python 画3维轨迹图并进行比较的实例
Dec 06 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
Python项目跨域问题解决方案
Jun 22 Python
Python多分支if语句的使用
Sep 03 Python
python 线程的五个状态
Sep 22 Python
python非标准时间的转换
Jul 25 Python
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
python实现手机推送 代码也就10行左右
Apr 12 #Python
You might like
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
php下使用SMTP发邮件的代码
2008/01/10 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
python文件拆分与重组实例
2018/12/10 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
python 实现简易的记事本
2020/11/30 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
英语教师求职信
2014/06/16 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
与美同行演讲稿
2014/09/13 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
离婚被告代理词
2015/05/23 职场文书
看上去很美观后感
2015/06/10 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB