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抓取行政区划码的方法
Nov 28 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
mac系统安装Python3初体验
Jan 02 Python
python多进程实现文件下载传输功能
Jul 28 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
Python3数字求和的实例
Feb 19 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
python机器学习实现决策树
Nov 11 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
TensorFlow打印输出tensor的值
Apr 19 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
python实现手机推送 代码也就10行左右
Apr 12 #Python
You might like
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
基于Javascript实现二级联动菜单效果
2016/03/04 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
js中的闭包学习心得
2018/02/06 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python实现数据库并行读取和写入实例
2017/06/09 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
暑假实习求职信范文
2013/09/22 职场文书
情况说明书格式范文
2014/05/06 职场文书
个人担保书格式范文
2014/05/12 职场文书
护士找工作求职信
2014/07/02 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
庆元旦演讲稿
2014/09/15 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL