当前位置: 首页 > news >正文

学会这7个绘图工具包,Matplotlib可视化也没那么难

导读:绘图是数据分析工作中的重要一环,是探索过程的一部分。Matplotlib是当前用于数据可视化的最流行的Python包之一,本文主要介绍数据可视化分析工具:Matplotlib。

Matplotlib是一个跨平台库,是根据数组中的数据制作2D图的可视化分析工具。Matplotlib提供了一个面向对象的API,有助于使用Python GUI工具包(如PyQt、WxPythonotTkinter)在应用程序中嵌入绘图。它也可以用于Python、IPython shell、Jupyter笔记本和Web应用程序服务器中。

Matplotlib提供了丰富的数据绘图工具,主要用于绘制一些统计图形,例如散点图、条形图、折线图、饼图、直方图、箱形图等。首先我们简单介绍一下Matplotlib.pyplot模块的绘图基础语法与常用参数,因为后面我们要介绍的各种图形基本都是基于这个模块来实现的。pyplot的基础语法及常用参数详见表1。

表1 pyplot的基础语法及常用参数

散点图

散点图通常用在回归分析中,描述数据点在直角坐标系平面上的分布。散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。在广告数据分析中,我们通常会根据散点图来分析两个变量之间的数据分布关系。散点图的主要参数及其说明如表2所示。

表2 散点图的主要参数及其说明

我们通过matplotlib.pyplot模块画一个散点图,如代码清单1所示。

代码清单1 绘制散点图
import numpy as np
import matplotlib.pyplot as plt 
x = np.arange(30)
y = np.arange(30)+3*np.random.randn(30)
plt.scatter(x, y, s=50) 
plt.show()

其可视化结果如下图所示。

图1 散点图

条形图

条形图是用宽度相同的条形的高度或长度来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱状图。此外,条形图有简单条形图、复式条形图等形式。条形图的主要参数及各参数说明如表3所示。

表3 条形图的主要参数及各参数说明

假设我们拿到了2017年内地电影票房前10的电影的片名和票房数据,如果想直观比较各电影票房数据大小,那么条形图显然是最合适的呈现方式,如代码清单2所示,其可视化结果如图2所示。

代码清单2 绘制条形图
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧!爸爸', '加勒比海盗5:死无对证','金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章']
# 单位:亿
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12]
# 用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] 
plt.rcParams['axes.unicode_minus']=False
# bar要求传递两个数字,可以单独设置x轴的显示
plt.bar(range(len(a)), b, width=0.3)  
plt.xticks(range(len(a)), a, rotation=90)  #字体倾斜角度
plt.grid(False)
plt.show()

图2 条形图

折线图

折线图是用直线连接排列在工作表的列或行中的数据点而绘制成的图形。折线图可以显示随时间(根据常用比例设置)而变化的连续数据,因此非常适用于显示相等时间间隔下数据的趋势。折线图的主要参数及各参数说明如表4所示。

表4 折线图的主要参数及各参数说明

以某广告平台随日期变化的用户请求数为例,我们用折线图来表现其变化趋势,如代码清单3所示,其可视化结果如图3所示。

代码清单3 绘制折线图
import matplotlib.dates as mdate
dateparse = lambda dates:pd.datetime.strptime(dates,'%Y%m%d')
data = pd.read_csv('req_user.csv',encoding='utf-8',parse_dates=['date'],date_parser=dateparse)
plt.figure(figsize=(10,7))
plt.plot(data["date"],data['req_user']) 
plt.xlabel('date',fontsize=15)
plt.ylabel('req_user',fontsize=15)  #图例字体大小
plt.tick_params(labelsize=10)  #刻度字体大小
plt.show()

图3 折线图

饼图

饼图常用于统计学模块中。用于显示一个数据系列中各项的大小与各项总和的比例。饼图中的数据点显示为整个饼图的百分比,饼图的主要参数及其说明如表5所示。

表5 饼图的主要参数及其说明

以某家庭10月份家庭支出情况为例,我们用饼图来体现各部分支出占家庭整体支出的情况,如代码清单4所示,其可视化结果如图4所示。

代码清单4 绘制饼图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签




labels = ['娱乐','育儿','饮食','房贷','交通','其他']
sizes = [4,10,18,60,2,6]
explode = (0,0,0,0.1,0,0)
plt.figure(figsize=(10,7))
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
plt.title("饼图示例-10月份家庭支出")
plt.show()

图4 饼图

直方图

直方图,又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,用纵轴表示分布情况。直方图是数值数据分布的精确图形表示,是对连续变量(定量变量)的概率分布的估计,由卡尔·皮尔逊(Karl Pearson)首先引入,是一种特殊的条形图。在构建直方图时,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。这些值通常被指定为连续的、不重叠的变量间隔,间隔必须相邻,并且通常是相等的大小。直方图的主要参数及说明如表6所示。

表6 直方图的主要参数及说明

下面我们以Kaggle经典比赛案例泰坦尼克号数据集为例,绘制乘客年龄的频数直方图,查看各年龄段乘客的年龄分布情况,如代码清单5所示,其可视化结果如图5所示。

代码清单5 绘制直方图
# 导入第三方包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取Titanic数据集
titanic = pd.read_csv('train.csv')
# 检查年龄是否有缺失
any(titanic.Age.isnull())
# 删除含有缺失年龄的样本
titanic.dropna(subset=['Age'], inplace=True)
# 设置图形的显示风格
plt.style.use('ggplot')
# 绘图
plt.hist(titanic.Age, 
        bins = 20, 
        color = 'steelblue', 
        edgecolor = 'k', 
        label = '直方图' ) 
# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
# 显示图例
plt.legend()
# 去除网格线
plt.grid(False)
plt.show()

图5 直方图

箱形图

箱形图又称为盒须图、盒式图或箱线图,是一种用于显示一组数据分散情况的统计图,因形状如箱子而得名。它主要用于反映原始数据分布的特征,也可以进行多组数据分布特征的比较。箱形图的主要参数及说明如表7所示。

表7 箱形图的主要参数及说明

下面绘制箱形图,如代码清单6所示。

代码清单6 绘制箱形图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
df = pd.DataFrame(np.random.rand(10,5),columns=['a','b','c','d','e'])
# 绘图
plt.boxplot(df,patch_artist=True)  #默认垂直摆放箱体
plt.show()

垂直箱形图与水平箱形图分别如图6、图7所示。

图6 垂直箱形图

图7 水平箱形图

组合图

前面介绍的都是在figure对象中创建单独的图像,有时候我们需要在同一个画布中创建多个子图或者组合图,此时可以用add_subplot创建一个或多个subplot来创建组合图,或者通过subplot使用循环语句来创建多个子图。pyplot.subplots的常用参数及说明如表8所示。

表8 pyplot.subplots的常用参数

使用add_subplot创建组合图,如代码清单7所示,其可视化结果如图8所示。

代码清单7 绘制组合图
from numpy.random import randn
import matplotlib.pyplot as plt
#在同一个figure中创建一组2行2列的subplot
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)  #表示4个subplot中的第一个
ax2 = fig.add_subplot(2,2,2)  #表示4个subplot中的第二个
ax3 = fig.add_subplot(2,2,3)  #表示4个subplot中的第三个
ax4 = fig.add_subplot(2,2,4)  #表示4个subplot中的第四个
ax1.scatter(np.arange(30),np.arange(30)+3*randn(30))
ax2.bar(np.arange(8),[1,2,3,7,8,5,6,4])
ax3.hist(randn(100),bins=20)
ax4.plot(randn(60).cumsum()) 
plt.show()

图8 组合图

通过subplot使用循环语句来创建组合图,如代码清单8所示,其可视化结果如图9所示。

代码清单8 使用循环语句绘制组合图
fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
for i in range(2):
    for j in range(2):
        axes[i,j].plot(randn(100).cumsum())
plt.subplots_adjust(wspace=0,hspace=0) #用于调整subplot周围的间距
plt.show()

图9  组合图

利用figure的subplot_adjust方法可以轻易地修改间距,其中wspace和hspace分别用于控制宽度和高度的百分比,可以用作subplot之间的间距。

本文摘编于《Python广告数据挖掘与分析实战》,广告行业数据分析和AI技术专家撰写,系统讲解广告数据挖掘模型、算法、方法,提供大量案例和代码。


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 5月书讯(下)| 5天小长假,一起读新书

书讯 | 5月书讯(上)| 5天小长假,一起读新书

资讯 | DB-Engines 4月数据库排名:Redis有望甩掉“千年老七”?

书单 | 360漏洞响应平台(SRC)为白帽子挑选的10本互联网安全好书

干货 | 数据仓库分层存储技术揭秘

收藏 | 计算机系统之芯——从零开始设计CPU

上新 | 【新书速递】深入理解Java虚拟机HotSpot

点击阅读全文购买

相关文章:

  • 多图详解数据中台建设框架(建议收藏)
  • ASC20-21超算大赛开战——有一群年轻人正在用超算的力量改变世界
  • 【第54期】“换道超车”:无人驾驶在中国的落地之路
  • 微服务究竟是“灵丹”还是“毒药”?
  • 【新书速递】字节跳动、360的智能硬件产品经验总结
  • 手把手教你用Scrapy爬取知乎大V粉丝列表
  • 这样构建的用户画像!想不懂你的用户都难
  • 【新书速递】硅谷和国内的数据中台有哪些区别?
  • DB-Engines 5月数据库排名:MySQL或将超越Oracle?
  • 如何评价一套合格的推荐系统?
  • 无处不在的架构之美
  • 《深入理解计算机系统》漫游指南
  • 2021年,薪酬最高的5种编程语言,你想学哪个?
  • 5个步骤带你入门FPGA设计流程
  • 【第55期】广告数据分析不知道怎么学?
  • 2017届校招提前批面试回顾
  • Android单元测试 - 几个重要问题
  • CSS 三角实现
  • HTML-表单
  • in typeof instanceof ===这些运算符有什么作用
  • Java超时控制的实现
  • js算法-归并排序(merge_sort)
  • Linux中的硬链接与软链接
  • MySQL几个简单SQL的优化
  • React组件设计模式(一)
  • Redis 中的布隆过滤器
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 闭包--闭包作用之保存(一)
  • 读懂package.json -- 依赖管理
  • 给新手的新浪微博 SDK 集成教程【一】
  • 缓存与缓冲
  • 计算机在识别图像时“看到”了什么?
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 硬币翻转问题,区间操作
  • 正则表达式
  • 整理一些计算机基础知识!
  • ​​​​​​​​​​​​​​Γ函数
  • ​力扣解法汇总946-验证栈序列
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​水经微图Web1.5.0版即将上线
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (7)STL算法之交换赋值
  • (a /b)*c的值
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (八)c52学习之旅-中断实验
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)Linux——Linux常用指令
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (转)C#调用WebService 基础
  • (转)jQuery 基础
  • (转)项目管理杂谈-我所期望的新人
  • .NET Reactor简单使用教程
  • .Net 访问电子邮箱-LumiSoft.Net,好用