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 paramiko实现ssh远程访问的方法
Dec 03 Python
Python中模块string.py详解
Mar 12 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
Django 用户认证组件使用详解
Jul 23 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
Python几种常见算法汇总
Jun 02 Python
PyQt5的相对布局管理的实现
Aug 07 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
Python可视化学习之matplotlib内置单颜色
Feb 24 Python
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
python实现手机推送 代码也就10行左右
Apr 12 #Python
You might like
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
python requests.post带head和body的实例
2019/01/02 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
如何在Django项目中引入静态文件
2019/07/26 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
小班重阳节活动方案
2014/02/08 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
Go语言基础知识点介绍
2021/07/04 Golang
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers