数据挖掘之Matplotlib
一、数据挖掘基础环境安装与使用
1、库的安装
matplotlib、
numpy、
pandas、
TA-Lib(技术指标库)
tables(hdf5)
Jupyter(数据分析与展示的平台)
2、软件推荐(Jupyter Notebook)
使用Jupyter Notebook,是IPython的加强网页版,一个开源Web应用程序,是一款程序员和科学工作者的编程/文档/笔记/展示软件。
.ipynb文件格式是用于计算型叙述的JSON文档格式的正式规范
3、Jupyter常用快捷键
运行代码:
Shift + Enter(执行本单元代码,并跳转到下一单元)
Ctrl + Enter(执行本单元代码,留在本单元)
4、Jupyter中的cell操作
cell: 一对In Out 会话被视作一个代码单元,称为cell
编辑模式(Enter)
(1)命令模式下,回车Enter 或 鼠标双击cell 进入编辑模式
(2)可以操作cell内文本或代码,剪切/复制/粘贴移动等操作
A,在当前cell的上面添加cell
B,在当前cell的下面添加cell
命令模式(ESC)
(1)按ESC退出编辑,进入命令模式
(2)可以操作cell单元本身进行剪切/复制/粘贴/移动等操作
二、数据挖掘之Matplotlib库
1、什么是Matplotlib
专门用于开发2D图表(包括3D图表)
以渐进、交互式方式实现数据可视化
1.1 基础入门
import matplotlib.pyplot as plt
%matplotlib inline
plt.figure()
plt.plot([1,0,9],[4,5,6])
plt.show()
Jupyter显示结果
2、Matplotlib三层结构
2.1 容器层
(1) 画板层(Canvas)
(2) 画布层(Figure)
可以设置画布的大小和分辨率
一个画布(Figure)可以包含多个绘图区(Axes),但是一个绘图区(Axes)只能属于一个画布(Figure)
plt.figure()
(3)绘图区/坐标系(Axes)
数据的绘图区域,一个坐标系(axes)可以包含多个坐标轴(axis),包含两个即为2d坐标系,3个即为3d坐标系。
plt.subplots()
2.2 辅助显示层
辅助显示层为绘图区(Axes)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容
2.3 图像层
图像层指绘图区(Axes)内通过折线图,散点图、饼图等函数根据数据绘制出的图像
3、折线图绘制与保存图片
3.1 matplotlib.pyplot模块
matplotlib.pyplot包含了一系列类似于matlab的画图函数,函数作用于当前图形(figure)的当前坐标系(Axes)。
import matplotlib.pyplot as plt
3.2 折线图绘制与显示(plot)
(1)设置画布属性与图片保存
#figsize: 指定图的长度
#dpi: 图像的清晰度
plt.figure(figsize=(20,8), dpi=80)
#保存图片
plt.savefig(path)
(2)展现上海一周的天气,比如从星期一到星期天的天气温度如下
import matplotlib.pyplot as plt
# 1、创建画布
plt.figure(figsize=(20, 8), dpi = 80)
# 2、绘制图像
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])
# 3、保存图片
plt.savefig("test1.png")
# 4、显示图像
plt.show()
注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。
(3)完善原始折线图(辅助显示层)
从辅助显示层方面来完善原始折线图,注意要设置中文字体,否则报错不显示。
# 需求: 画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度到18度
import random
import matplotlib.pyplot as plt
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 1、准备数据 x y
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 2、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制图像
plt.plot(x,y_shanghai)
# 4、修改x,y刻度
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度标签
y_ticks = range(40)
plt.xticks(x[::5],x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 5、添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 6、添加描述信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("某城市11点到12点每分钟的温度变化状况")
# 7、显示图像
plt.show()
结果显示
(4)完善原始折线图2(图像层)
# 需求:再添加一个城市的温度变化
# 需求: 画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度到18度
import random
import matplotlib.pyplot as plt
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 1、准备数据 x y
x = range(60)
# 收集到上海当天温度变化情况,温度在15度到18度
# 准备上海的数据
y_shanghai = [random.uniform(15, 18) for i in x]
# 收集到北京当天温度变化情况,温度在1度到3度
# 准备北京的数据
y_beijing = [random.uniform(1, 3) for i in x]
# 2、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制图像
plt.plot(x,y_shanghai, color="r", linestyle="-.", label="上海")
plt.plot(x,y_beijing, color="b", label="北京")
# 4、显示图例
plt.legend()
# 5、修改x,y刻度
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度标签
y_ticks = range(40)
plt.xticks(x[::5],x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 6、添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 7、添加描述信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("北京、上海11点到12点每分钟的温度变化状况")
# 8、显示图像
plt.show()
结果
(5)创建多个绘图区(面向对象的画图方法)
matplotlib.pyplot.subplots(nrows = 1, nclos = 1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图
注意:plt.函数名()相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法。
相关代码
# 需求:再添加一个城市的温度变化
# 需求: 画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度到18度
import random
import matplotlib.pyplot as plt
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 1、准备数据 x y
x = range(60)
# 收集到上海当天温度变化情况,温度在15度到18度
# 准备上海的数据
y_shanghai = [random.uniform(15, 18) for i in x]
# 收集到北京当天温度变化情况,温度在1度到3度
# 准备北京的数据
y_beijing = [random.uniform(1, 3) for i in x]
# 2、创建画布
# plt.figure(figsize=(20, 8), dpi=80)
figure, axes= plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=80)
# 3、绘制图像
axes[0].plot(x,y_shanghai, color="r", linestyle="-.", label="上海")
axes[1].plot(x,y_beijing, color="b", label="北京")
# 4、显示图例
axes[0].legend()
axes[1].legend()
# 5、修改x,y刻度
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度标签
y_ticks = range(40)
axes[0].set_xticks(x[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[0].set_yticks(y_ticks[::5])
axes[1].set_xticks(x[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
axes[1].set_yticks(y_ticks[::5])
# 6、添加网格显示
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)
# 7、添加描述信息
axes[0].set_xlabel("时间变化")
axes[0].set_ylabel("温度变化")
axes[0].set_title("上海11点到12点每分钟的温度变化状况")
axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("北京11点到12点每分钟的温度变化状况")
# 8、显示图像
plt.show()
注意:使用subplot方法创建的图表不能直接使用set_sticks方法传入自定义的刻度,必须使用set_sticklabels()方法
结果为:
(6)绘制数学函数图像
import random
import matplotlib.pyplot as plt
import numpy as np
#用来正常显示正负号
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 1、准备x,y数据
x = np.linspace(-1, 1, 1000)
y = 2 * x * x
# 2、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制图像
plt.plot(x,y)
# 4、添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 5、显示图像
plt.show()
结果
4、常见图表
4.1 散点图(scatter)
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
(1)相关代码
import matplotlib.pyplot as plt
# 1、房屋面积
x = [225.98, 247.07, 253.14, 457.85, 301.01, 20.67, 342.75, 483.21]
# 2、房屋价格
y = [196.63, 203.88, 210.75, 247.61, 288.23, 400.02, 330.64, 33.1]
# 3、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 4、绘制图像
plt.scatter(x, y)
# 5、显示图像
plt.show()
(2)结果
4.2 柱状图(bar)
柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中
特点:绘制连离散的数据,能够比较数据之间的差别(统计/对比)
(1)数量统计相关代码
import matplotlib.pyplot as plt
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 1、准备数据
movie_names = ['正义联盟', '寻梦环游记', '全球风暴', '追捕']
tickets = [73853,57767,22354,15969]
# 2、创建画布
plt.figure(figsize=(20,8), dpi=80)
# 3、绘制柱状图
x_ticks = range(len(movie_names))
plt.bar(x_ticks, tickets, color=['b','r','g','y'], width=0.2)
# 4、修改x刻度
plt.xticks(x_ticks, movie_names)
# 5、添加标题
plt.title("电影票房收入对比")
# 6、添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 6、显示图像
plt.show()
结果
(2)用户数量对比分析
import matplotlib.pyplot as plt
#设置字体为楷体
plt.rcParams['font.sans-serif'] = ['KaiTi']
# 1、准备数据
movie_name = ['雷神', '正义联盟', '寻梦环游记']
first_day = [10587.6, 10062.5, 1275.7]
first_weekend = [36224.9, 34479.6, 11830]
# 2、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制柱状图
plt.bar(range(3), first_day, width=0.2, label="首日票房")
plt.bar([0.2, 1.2, 2.2], first_weekend, width=0.2, label="首周票房")
# 显示图例
plt.legend()
# 修改刻度
plt.xticks([0.1, 1.2, 2.2], movie_name)
# 4、显示图像
plt.show()
结果
4.3 直方图(histogram)
直方图:由一系列高度不等的纵向条纹或线段表示数据的分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
(1)相关概念
组数:在统计数据时,将数据按照不同的范围分成几个组,分成的组的个数称为组数
组距:每一组两个端点的差
(2)直方图与柱状图的对比
直方图展示数据的分布,柱状图比较数据的大小
直方图X轴为定量数据,柱状图X轴为分类数据
直方图柱子无间隔,柱状图柱子有间隔
直方图柱子宽度可不一,柱状图柱子宽度须一致
(3)设置组距
组数 = 极差/组距=(max - min)/bins
(4)相关代码
# 电影时长分布状况
import matplotlib.pyplot as plt
# 1、准备数据
time = [131, 98, 125, 131, 124, 139, 131, 117, 128]
# 2、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制直方图
distance = 2
group_num = int((max(time) - min(time))/distance)
plt.hist(time, bins=group_num, density=True)
# 4、修改x轴刻度
plt.xticks(range(min(time), max(time)+2, distance))
# 5、添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 6、显示图像
plt.show()
结果
4.4 饼图(pie)
饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类
特点:分类数据的占比情况(占比)
(1)相关代码
import matplotlib.pyplot as plt
# 1、准备数据
movie_name = ['白菜', '土豆', '辣椒', '鸡腿']
place_count = [60605, 54546, 45819, 28243]
# 2、创建画布
plt.figure(figsize=(20, 8),dpi=80)
# 3、绘制饼图
plt.pie(place_count, labels=movie_name, colors=['b','r','g','y'], autopct="%1.2f%%")
# 4、显示图例
plt.legend()
# 5、使饼图大小保持一致
plt.axis('equal')
# 6、显示图像
plt.show()