绘图是数据分析工作中的重要一环,是探索过程的一部分。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广告数据挖掘与分析实战》,经出版方授权发布。
今日福利
赠送 4 本书籍《Python广告数据挖掘与分析实战》,书籍由机械工业出版社华章公司赞助。
参与方式:
通过在本文留言参与,赠送4本,留言的主题如下:
数据可视化,你使用最多的是哪些工具?或
推荐一本书你读过的,觉得不错的书籍,并用一句话来描述你推荐的原因。
参与方式:在公众号「Python数据之道」的本篇文章底部点击「在看」+「留言」,优质留言才可上墙!留言点赞数量最多的「前4位」读者将获得书籍,截止时间「6月13号20点」,最终获赠者通过微信联系我(微信ID:LemonDT2069)。
PS:禁止恶意刷赞!发现后将进入黑名单,取消上墙资格。