【数据挖掘】2022数据挖掘之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()
(2)结果

在这里插入图片描述

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊凯瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值