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简单读取大文件的方法
Jul 01 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
浅谈Django的缓存机制
Aug 23 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
python实现简单图片物体标注工具
Mar 18 Python
linux下python中文乱码解决方案详解
Aug 28 Python
python文字转语音实现过程解析
Nov 12 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
5款实用的python 工具推荐
Oct 13 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
python数字图像处理数据类型及颜色空间转换
Jun 28 Python
python创建字典及相关管理操作
python微信智能AI机器人实现多种支付方式
Python中request的基本使用解决乱码问题
Apr 12 #Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Python安装使用Scrapy框架
Python使用华为API为图像设置多个锚点标签
python实现手机推送 代码也就10行左右
Apr 12 #Python
You might like
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
react-native 封装选择弹出框示例(试用ios&android)
2017/07/11 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python实现从web抓取文档的方法
2014/09/26 Python
Python 的 Socket 编程
2015/03/24 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Python 闭包的使用方法
2017/09/07 Python
python 上下文管理器使用方法小结
2017/10/10 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
幼儿教师暑期培训方案
2014/08/27 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
孔庙导游词
2015/02/04 职场文书
七年级作文之环保作文
2019/10/17 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
Python OpenCV超详细讲解基本功能
2022/04/02 Python
python中 .npy文件的读写操作实例
2022/04/14 Python
pt-archiver 主键自增
2022/04/26 MySQL