本文涵盖Mtplotlib画图的所有知识的和美化,源代码和数据均在github已上传,欢迎star哦:
https://github.com/w1449550206/Matplotlib.git


学完本文,您会收获些什么?

  • 知道Matplotlib的架构
  • 应用Matplotlib的基本功能实现图形显示
  • 应用Matplotlib实现多图显示
  • 应用Matplotlib实现不同画图种类

注意:学习这个工具要知道他是怎么使用的,要掌握的是逻辑

一、Matplotlib之HelloWorld

学完本节,您会收获些什么?

  • 了解什么是matplotlib
  • 为什么要学习matplotlib
  • matplotlib的三层结构介绍
  • 应用

1 什么是Matplotlib

  • 是专门用于开发2D图表(包括3D图表)

  • 使用起来及其简单

  • 以渐进、交互式方式实现数据可视化

数据可视化 画图

要学会怎么使用,主要掌握的要是逻辑

学会常见图形

折线图 散点图 柱状图 直方图 饼图

2 为什么要学习Matplotlib

可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。

  • 能将数据进行可视化,更直观的呈现
  • 使数据更加客观、更具说服力

例如下面两个图为数字展示和图形展示:

3 实现一个简单的Matplotlib画图

import matplotlib.pyplot as plt

# 1.创建画布
plt.figure(figsize=(20,8), dpi=100)

# 2.绘制图像
x = [1,2,3]
y = [4,5,6]
plt.plot(x, y)

# 3.显示图像
plt.show()

4 认识Matplotlib图像结构(拓展,了解)

5 Matplotlib三层结构(拓展,了解)

5.1 容器层

容器层主要由Canvas、Figure、Axes组成。

Canvas画板(只有一个不用去管)
Figure画布(只有一个不用去管,接受一下即可)
Axes绘图区域(重点,有可能在旁边画好几个图,所以是一个二维数组)


Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具。

Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。

Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。

  • Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
  • Axes(坐标系):数据的绘图区域
  • Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签

特点为:

  • 一个figure(图像)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
  • 一个axes(坐标系/绘图区)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系

5.2 辅助显示层

辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。

该层的设置可使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质的影响。

5.3 图像层

图像层指Axes内通过plot线形图、scatte散点图、bar柱状、histogram直方、pie饼图等函数根据数据绘制出的图像。

  • 总结:
    • Canvas(画板)位于最底层,用户一般接触不到
    • Figure(画布)建立在Canvas之上
    • Axes(绘图区)建立在Figure之上
    • 坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上

6 小结

  • 什么是matplotlib【了解】
    • 是专门用于开发2D(3D)图表的包
  • 绘制图像流程【掌握】
    • 1.创建画布 – plt.figure(figsize=(20,8))
    • 2.绘制图像 – plt.plot(x, y)
    • 3.显示图像 – plt.show()
  • matplotlib图像结构【了解】
    • 容器层
      • Canvas – 画板
        • 是底层实现,不需要关注
      • Figure – 画布
        • 在使用之前,每次都需要进行实例化
      • axes – 坐标系
        • 数据的绘图区域
    • 辅助显示层
      • 主要作用添加坐标轴描述,标题等内容
    • 图像层
      • 设定要画一个什么样的图像:plot,scatter…

二、折线图(plot)与基础绘图功能

学完本节,您会收获些什么?

  • 学习折线图的绘制和图形保存
  • 给图形添加辅助功能(如:标注、x,y轴名称、标题等)
  • 多次plot绘制图形
  • 多个坐标系显示图形
  • 知道折线图的应用场景
  • 应用
    • 天气的温度变化显示

1 折线图绘制与保存图片

简单绘制

#导入matplotlib
import matplotlib.pyplot as plt

#创建画布 figsize画布大小 dpi像素密度
#只绘制一个图的话不用去设置绘图区域
plt.figure(figsize=(20,8),dpi=100)

#绘制图像
plt.plot([1,2,3,4,5,6,7],[1,4,9,16,25,36,49])

#显示图像
plt.show()

为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用

1.1 matplotlib.pyplot模块

matplotlib.pytplot包含了一系列类似于matlab的画图函数。 它的函数作用于当前图形(figure)的当前坐标系(axes)

import matplotlib.pyplot as plt

1.2 折线图绘制与显示

绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06

#导入工具
import matplotlib.pyplot as plt

#创建画布
plt.figure(figsize=(20,8),dpi = 100)

#绘制图像,绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06
plt.plot([1,2,3,4,5,6,7],[9,7,6,7,4,6,8])

#显示图像
plt.show()#如果不用show的话,只是在缓存中


展现上海一周的天气,比如从星期一到星期日的天气温度如下

# 1.创建画布(容器层)
plt.figure(figsize=(10, 10))

# 2.绘制折线图(图像层)
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])

# 3.显示图像
plt.show()

可以看到这样显示效果并不好,我们可以加入更多的功能:

1.3 设置画布属性与图片保存

保存图像

#导入工具
import matplotlib.pyplot as plt

#创建画布
plt.figure(figsize=(20,8),dpi = 100)

#绘制图像,绘制安徽省宣城市泾县未来一周的最低气温2020.02.29-2020.03.06
plt.plot([1,2,3,4,5,6,7],[9,7,6,7,4,6,8])

#保存图像
plt.savefig('./安徽省宣城市泾县未来一周最低气温折线图')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

如果在show后面再执行保存代码,那么就会失败!!!
因为绘制图像立马保存在内存中,直接save可以,但是用了show之后,内存就会清空,我们再去保存的话,就是空白的
因此,保存图像,必须在显示图像之前
savefig必须在show之前!!!!!!!!!!!!

plt.figure(figsize=(), dpi=)
    figsize:指定图的长宽
    dpi:图像的清晰度
    返回fig对象
plt.savefig(path)
# 1.创建画布,并设置画布属性
plt.figure(figsize=(20, 8), dpi=80)
# 2.保存图片到指定路径
plt.savefig("test.png")
  • 注意:plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。

2 完善原始折线图1(辅助显示层)

案例:显示温度变化状况

需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度(随机产生)

效果:

2.1 准备数据并画出初始折线图

# 画出温度变化图

# 0.准备x, y坐标的数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=80)

# 2.绘制折线图
plt.plot(x, y_shanghai)

# 3.显示图像
plt.show()

2.2 添加自定义x,y刻度

  • plt.xticks(x, **kwargs)

    x:要显示的刻度值

  • plt.yticks(y, **kwargs)

    y:要显示的刻度值

# 增加以下两行代码
# 构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
# 构造y轴刻度
y_ticks = range(40)

# 修改x,y轴坐标的刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

如果没有解决过中文问题的话,会显示这个样子:


加了刻度的案例

#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
plt.figure(figsize=(20,8),dpi = 80)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数

plt.plot(x,y_jingxian)

plt.rcParams['font.family']=['SimHei']

#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('温度',fontsize = 20)
plt.title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 20)

# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上

# # 添加y坐标轴刻度
y_range = range(40)
plt.yticks(y_range[::5])#[::5]是每隔五个选一个

#保存图像
plt.savefig('./安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

2.3 中文显示问题解决

windows

【重要】设置支持中文,windows可以设置字***置,但是linux’不行,所以我们要记住这个方法
plt.rcParams['font.family'] = ['SimHei']

#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
plt.figure(figsize=(20,8),dpi = 80)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数

plt.plot(x,y_jingxian)

plt.rcParams['font.family']=['SimHei']

#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('while度',fontsize = 20)
plt.title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 20)

#保存图像
plt.savefig('./安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

非windos

下载中文字体(黑体,看准系统版本)

  • 下载 SimHei字体(或者其他的支持中文显示的字体也行)
    这个字体网上可以下载到,如果找不到可以评论or私信我

  • 安装字体

    • linux下:拷贝字体到 usr/share/fonts 下:

      sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
      
    • windows和mac下:双击安装

  • 删除~/.matplotlib中的缓存文件

    cd ~/.matplotlib
    rm -r *
    
  • 修改配置文件matplotlibrc

    vi ~/.matplotlib/matplotlibrc
    

    将文件内容修改为:

    font.family         : sans-serif
    font.sans-serif         : SimHei
    axes.unicode_minus  : False
    
    

    就ok了

2.4 添加网格显示

为了更加清楚地观察图形对应的值

plt.grid(True, linestyle='--', alpha=0.5)


注意线型可以选择的有

风格字符
- 实线
- - 虚线
-. 点划线
: 点虚线
’ ’ 留空、空格

加了网格显示的案例

#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
plt.figure(figsize=(20,8),dpi = 80)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数

plt.plot(x,y_jingxian)

plt.rcParams['font.family']=['SimHei']

#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('温度',fontsize = 20)
plt.title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 20)

# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上

# # 添加y坐标轴刻度
y_range = range(40)
plt.yticks(y_range[::5])#[::5]是每隔五个选一个

#添加网格线 linestyle线型 alpha透明度
plt.grid(True,linestyle = '--',alpha=0.3)

#保存图像
plt.savefig('./安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

2.5 添加描述信息

添加x轴、y轴描述信息及标题

plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点0分到12点之间的温度变化图示")

3 完善原始折线图2(图像层)

3.1 多次plot

需求:再添加一个城市的温度变化

收集到北京当天温度变化情况,温度在1度到3度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示

# 增加北京的温度数据
y_beijing = [random.uniform(1, 3) for i in x]

# 绘制折线图
plt.plot(x, y_shanghai, label="上海")
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")

# 显示图例
plt.legend(loc="best")

我们仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例。

两个城市的折线图在同一张图像上的案例

# 需求:再添加一个城市的温度变化

#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
plt.figure(figsize=(20,8),dpi = 80)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数
y_beijing = [random.uniform(3,8) for i in x]#列表生成式,uniform定义范围得到一个随机数

#绘制两个折线图
plt.plot(x,y_jingxian)
plt.plot(x,y_beijing)

plt.rcParams['font.family']=['SimHei']

#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('温度',fontsize = 20)
plt.title('安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图',fontsize = 30)

# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上

# # 添加y坐标轴刻度
y_range = range(40)
plt.yticks(y_range[::5])#[::5]是每隔五个选一个

#添加网格线 linestyle线型 alpha透明度
plt.grid(True,linestyle = ':',alpha=0.8)

#保存图像
plt.savefig('./安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

增加图例的案例

# 需求:再添加一个城市的温度变化

#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
plt.figure(figsize=(20,8),dpi = 80)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数
y_beijing = [random.uniform(3,8) for i in x]#列表生成式,uniform定义范围得到一个随机数

#绘制两个折线图
plt.plot(x,y_jingxian,label = '泾县')
plt.plot(x,y_beijing,label = '北京')

plt.rcParams['font.family']=['SimHei']

#添加描述信息
plt.xlabel('时间',fontsize = 20)
plt.ylabel('温度',fontsize = 20)
plt.title('安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图',fontsize = 30)

# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上

# # 添加y坐标轴刻度
y_range = range(40)
plt.yticks(y_range[::5])#[::5]是每隔五个选一个

#添加网格线 linestyle线型 alpha透明度
plt.grid(True,linestyle = ':',alpha=0.8)

#添加图例 loc指定图例的位置
plt.legend(loc = 'best')

#保存图像
plt.savefig('./安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

图例的参数

#添加图例 loc指定图例的位置
plt.legend(loc = 'best')

这个loc可以选择的有:

比如3是左下,可以写数字3也可以写英文lower left,整数看不懂,不推荐使用哦~~~

3.2 设置图形风格

颜色字符 风格字符
r 红色 - 实线
g 绿色 - - 虚线
b 蓝色 -. 点划线
w 白色 : 点虚线
c 青色 ’ ’ 留空、空格
m 洋红
y 黄色
k 黑色

显示图例

  • 注意:如果只在plt.plot()中设置label还不能最终显示出图例,还需要通过plt.legend()将图例显示出来。
plt.legend(loc="best")

完整代码:

import random

# 多次plot
# 0.创建数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x]
y_beijing = [random.uniform(-5, 5) for i in x]

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2.绘制图
plt.plot(x, y_shanghai, label="上海", color="r", linestyle="--")
plt.plot(x, y_beijing, label="北京")

# 2.1 添加x,y轴的刻度
x_labels_ticks = ["11点{}分".format(i) for i in x]
y_labels_ticks = range(-10, 30)

plt.xticks(x[::5], x_labels_ticks[::5])
plt.yticks(y_labels_ticks[::5])

# 2.2 添加网格线
plt.grid(linestyle="--", alpha=0.5)

# 2.3 添加描述信息
plt.xlabel("时间", fontsize=16)
plt.ylabel("温度", fontsize=16)
plt.title("某城市11点-12点温度变化", fontsize=20)

# 2.4 增加图例
plt.legend(loc="best")

# 3.显示
plt.show()

练习多个坐标系绘制之前的案例北京和泾县的图吧~~~

需求:多个坐标系
创建画布的时候要修改了,用subplots,参数nrows多少行,我们现在需要一行两列nrows=1,参数ncols多少列,我们现在需要一行两列你cols=2
参数figsize是画布大小我们设置为figsize=(20,8)
dpi
plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)
#创建画布
# plt.figure(figsize=(20,8),dpi = 80)
plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)
然后他们需要被接受一下
被接受的一个是画布一个是绘图区域对象(数组)
fig,ax = plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)
然后绘制的方法要修改了
指定坐标系
ax[0].plot(x,y_beijing,label=‘北京’)
ax[1].plot(x,y_jingxian,label=‘泾县’)
#绘制两个折线图
# plt.plot(x,y_jingxian,label = '泾县')
# plt.plot(x,y_beijing,label = '北京')
ax[0].plot(x,y_jingxian,label = '泾县')
ax[1].plot(x,y_beijing,label = '北京')
#然后描述信息也要变化
需要把plt.xlabel改成ax[0].set_label()!!!!
#添加描述信息
# plt.xlabel('时间',fontsize = 20)
# plt.ylabel('温度',fontsize = 20)
# plt.title('安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度
变化折线图',fontsize = 30)
ax[0].set_xlabel('时间',fontsize = 20)
ax[0].set_ylabel('温度',fontsize = 20)
ax[0].set_title('安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图',fontsize = 30)
ax[1].set_xlabel('时间',fontsize = 20)
ax[1].set_ylabel('温度',fontsize = 20)
ax[1].set_title('北京市11点到12点1小时内每分钟的温度变化折线图',fontsize = 30)
坐标轴刻度也要改
plt.xticks改成每个坐标系去设置
改成ax[0].set_xticks
刻度里面也要改
本来是plt.xticks(x[::5],x_tick_label[::5])
现在要改成
ax[0].set_xticks(x[::5])# ax[0].set_xticklabels(x_tick_label[::5])【分成了两步啊!!!这个接口要注意啊!!!】
# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]
# # plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上
ax[0].set_xticks(x[::5])
ax[0].set_xticklabels(x_tick_label[::5])
ax[1].set_xticks(x[::5])
ax[1].set_xticklabels(x_tick_label[::5])
# # # 添加y坐标轴刻度
y_range = range(40)
ax[0].set_yticks(y_range[::5])
ax[1].set_yticks(y_range[::5])
添加网格线也要改啊
plt.grid改成
ax[0].grid
ax[1].grid
ax[0].grid(linestyle='--', alpha=0.8)
ax[1].grid(linestyle='--', alpha=0.8)
添加图例也要改
ax[0].legend
ax[1].legend
ax[0].legend(loc = 'best')
ax[1].legend(loc = 'best')
显示图片不要改的
更改颜色就是在plot的里面添加颜色color='r’红色

ax[0].plot(x,y_jingxian,label = '泾县')
ax[1].plot(x,y_beijing,label = '北京',color='r')

代码

# 需求:多个坐标系
# 创建画布的时候要修改了
# 用subplots
# 参数nrows多少行,我们现在需要一行两列nrows=1
# 参数ncols多少列,我们现在需要一行两列你cols=2
# 参数figsize是画布大小我们设置为figsize=(20,8)
# dpi
# plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)
# 然后他们需要被接受一下
# 被接受的一个是画布一个是绘图区域对象(数组)
# fig,ax = plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)
# 然后绘制的方法要修改了
# 指定坐标系
# ax[0].plot(x,y_beijing,label='北京')
# ax[1].plot(x,y_jingxian,label='泾县')
#然后描述信息也要变化
# 需要把plt.xlabel改成ax[0].set_label()!!!!
# 坐标轴刻度也要改
# plt.xticks改成每个坐标系去设置
# 改成ax[0].set_xticks
# # 刻度里面也要改
# 本来是plt.xticks(x[::5],x_tick_label[::5])
# 现在要改成
# ax[0].set_xticks(x[::5])
# ax[0].set_xtickslabels(x_tick_label[::5])【分成了两步啊!!!这个接口要注意啊!!!】
#添加网格线也要改啊
# plt.grid改成
# ax[0].grid
# ax[1].grid
# #添加图例也要改
# ax[0].legend
# ax[1].legend
# 显示图片不要改的
# 更改颜色就是在plot的里面添加颜色color='r'红色



#导入工具
import matplotlib.pyplot as plt
import random

#创建画布
# plt.figure(figsize=(20,8),dpi = 80)
fig,ax = plt.subplots(nrows=1,ncols=2,figsize = (20,8), dpi=100)

#绘制图像,画出安徽省宣城市泾县11点到12点1小时内每分钟的温度变化折线图,
#温度范围在15度~18度(随机产生)
x = range(60)
y_jingxian = [random.uniform(15,18) for i in x]#列表生成式,uniform定义范围得到一个随机数
y_beijing = [random.uniform(3,8) for i in x]#列表生成式,uniform定义范围得到一个随机数

#绘制两个折线图
# plt.plot(x,y_jingxian,label = '泾县')
# plt.plot(x,y_beijing,label = '北京')
ax[0].plot(x,y_jingxian,label = '泾县')
ax[1].plot(x,y_beijing,label = '北京',color='r')

plt.rcParams['font.family']=['SimHei']

#添加描述信息
# plt.xlabel('时间',fontsize = 20)
# plt.ylabel('温度',fontsize = 20)
# plt.title('安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图',fontsize = 30)
ax[0].set_xlabel('时间',fontsize = 20)
ax[0].set_ylabel('温度',fontsize = 20)
ax[0].set_title('安徽省宣城市泾县每分钟的温度变化折线图',fontsize = 30)
ax[1].set_xlabel('时间',fontsize = 20)
ax[1].set_ylabel('温度',fontsize = 20)
ax[1].set_title('北京市每分钟的温度变化折线图',fontsize = 30)



# # 添加x坐标轴刻度
x_tick_label = ["11点{}分".format(i) for i in x]

# # plt.xticks(x[::5],x_tick_label[::5])# [::5]是每隔五个选一个,后面的也要对应上
ax[0].set_xticks(x[::5])
ax[0].set_xticklabels(x_tick_label[::5])
ax[1].set_xticks(x[::5])
ax[1].set_xticklabels(x_tick_label[::5])


# # # 添加y坐标轴刻度
y_range = range(40)
ax[0].set_yticks(y_range[::5])
ax[1].set_yticks(y_range[::5])


# 添加网格线
# plt.grid(linestyle='--', alpha=0.8)
ax[0].grid(linestyle='--', alpha=0.8)
ax[1].grid(linestyle='--', alpha=0.8)

#添加网格线 linestyle线型 alpha透明度
plt.grid(True,linestyle = ':',alpha=0.8)

#添加图例 loc指定图例的位置
ax[0].legend(loc = 'best')
ax[1].legend(loc = 'best')

#保存图像
plt.savefig('./安徽省宣城市泾县对比北京市11点到12点1小时内每分钟的温度变化折线图.png')

#显示图像
plt.show()#如果不用show的话,只是在缓存中

4 练一练

练习多次plot流程(从上面复制代码,到自己电脑,确保每人环境可以正常运行),

同时明确每个过程执行实现的具体效果

5 多个坐标系显示-plt.subplots(面向对象的画图方法)

如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中,效果如下:

可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数

  • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图

    Parameters:    
    
    nrows, ncols : int, optional, default: 1, Number of rows/columns of the subplot grid.
    **fig_kw : All additional keyword arguments are passed to the figure() call.
    
    Returns:    
    fig : 图对象
    ax : 
        设置标题等方法不同:
        set_xticks
        set_yticks
        set_xlabel
        set_ylabel
    
    

    关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

  • 注意:**plt.函数名()**相当于面向过程的画图方法,**axes.set_方法名()**相当于面向对象的画图方法。

# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
# 多个axes
# 0.构造数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 14) for i in x]

# 1.创建画布
# plt.figure(figsize=(20, 8))
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)

# 2.图像绘制
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, label="北京", linestyle="--", color="r")
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, label="北京", linestyle="--", color="r")

# 2.1 添加x,y轴刻度
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)

# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

# 2.2 添加网格显示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

# 2.3 添加x,y轴描述和标题
# plt.xlabel("时间")
# plt.ylabel("温度")
# plt.title("中午11点--12点温度变化图", fontsize=25)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("上海中午11点--12点温度变化图", fontsize=25)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("北京中午11点--12点温度变化图", fontsize=25)

# 2.4 显示图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)

# 3.显示
plt.show()

6 折线图的应用场景

  • 呈现公司产品(不同区域)每天活跃用户数

  • 呈现app每天下载数量

  • 呈现产品新功能上线后,用户点击次数随时间的变化

  • 拓展:画各种数学函数图像

    • 注意:plt.plot()除了可以画折线图,也可以用于画各种数学函数图像

      代码:
import numpy as np
# 0.准备数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)

# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)

# 2.绘制函数图像
plt.plot(x, y)
# 2.1 添加网格显示
plt.grid()

# 3.显示图像
plt.show()

7 小结

  • 图像保存【知道】
    • plt.savefig(“路径”)
  • 添加x,y轴刻度【知道】
    • plt.xticks()
    • plt.yticks()
    • 注意:在传递进去的第一个参数必须是数字,不能是字符串,如果是字符串吗,需要进行替换操作
  • 添加网格显示【知道】
    • plt.grid(linestyle="–", alpha=0.5)
  • 添加描述信息【知道】
    • plt.xlabel()
    • plt.ylabel()
    • plt.title()
  • 多次plot【了解】
    • 直接进行添加就OK
  • 显示图例【知道】
    • plt.legend(loc=“best”)
    • 注意:一定要在plt.plot()里面设置一个label,如果不设置,没法显示
  • 多个坐标系显示【了解】
    • plt.subplots(nrows=, ncols=)
  • 折线图的应用【知道】
    • 1.应用于观察数据的变化
    • 2.可是画出一些数学函数图像

三、常见图形绘制

学完本节,您会收获些什么?

  • 掌握常见统计图及其意义
  • 绘制散点图和柱状图
  • 应用
    • 探究不同变量之间的关系

Matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。

我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据。

1 常见图形种类及意义

折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

api:plt.plot(x, y)

折线图:比如每天的APP的下载量=

散点图: 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

api:plt.scatter(x, y)
散点图:看点在哪些位置,相似的会在一起,找线性关系,找异常点

柱状图: 排列在工作表的列或行中的数据可以绘制到柱状图中。

特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
柱状图:比如电影的票房,对比大小关系

api:plt.bar(x, y, width, align='center', **kwargs)

Parameters:    
x ,y: sequence of scalars.

width : scalar or array-like, optional
柱状图的宽度

align : {‘center’, ‘edge’}, optional, default: ‘center’
Alignment of the bars to the x coordinates:
‘center’: Center the base on the x positions.
‘edge’: Align the left edges of the bars with the x positions.
每个柱状图的位置对齐方式

**kwargs :
color:选择柱状图的颜色

**直方图:**由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。

直方图:比如电影的票房,对比大小关系

特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)

api:matplotlib.pyplot.hist(x, bins=None)

Parameters:    
x : (n,) array or sequence of (n,) arrays

bins : integer or sequence or ‘auto’, optional
组距


通俗解释

  • **饼图:**用于表示不同分类的占比情况,通过弧度大小来对比各种分类。

    特点:分类数据的占比情况(占比)

    api:plt.pie(x, labels=,autopct=,colors)

    x:数量,自动算百分比
    labels:每部分名称
    autopct:占比显示指定%1.2f%%
    colors:每部分颜色
    

2 散点图绘制

需求:探究房屋面积和房屋价格的关系

房屋面积数据:

x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01,  20.67, 288.64,
       163.56, 120.06, 207.83, 342.75, 147.9 ,  53.06, 224.72,  29.51,
        21.61, 483.21, 245.25, 399.25, 343.35]

房屋价格数据:

y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61,  24.9 , 239.34,
       140.32, 104.15, 176.84, 288.23, 128.79,  49.64, 191.74,  33.1 ,
        30.74, 400.02, 205.35, 330.64, 283.45]

代码:

import matplotlib.pyplot as plt

# 获取数据 
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01,  20.67, 288.64,
       163.56, 120.06, 207.83, 342.75, 147.9 ,  53.06, 224.72,  29.51,
        21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61,  24.9 , 239.34,
       140.32, 104.15, 176.84, 288.23, 128.79,  49.64, 191.74,  33.1 ,
        30.74, 400.02, 205.35, 330.64, 283.45]

# 创建画布
plt.figure(figsize=(20,8),dpi=100)

#绘制图像 散点图
plt.scatter(x,y)

#显示图像 大体上在一条直线上,有一个异常点重点看一下
plt.show()

3 柱状图绘制

需求-对比每部电影的票房收入

电影数据如下图所示:

1 准备数据

['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]

2 绘制

matplotlib.pyplot.bar(x, width, align='center', **kwargs)

绘制柱状图

代码:

import matplotlib.pyplot as plt

#获取数据
movies_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
x = range(len(movies_name))

# 创建画布
plt.figure(figsize = (20,8), dpi = 80)

# 设置中文
plt.rcParams['font.family'] = ['SimHei']

# 绘制图像
plt.bar(x,y,width=0.6,color = ['r','g','b','r','g','b','r','g','b','r','g'])

#设置x轴的刻度
plt.xticks(x,movies_name)# 【重要】

# 添加网格显示
plt.grid(linestyle="--", alpha=0.5)

# 添加标题
plt.title("电影票房收入对比")

# 保存图像
plt.savefig('./电影票房收入对比.png')

# 显示图像
plt.show()


参考链接:

https://matplotlib.org/index.html

4 直方图绘制

需求-展示六年级同学的身高情况

身高数据如下所示:

[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]

1 准备数据

a=[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]

2 绘制

matplotlib.pyplot.hist(x, bins=None)

绘制直方图

代码:

import matplotlib.pyplot as plt

# 设置中文
plt.rcParams['font.family'] = ['SimHei']

# 准备数据
a=[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]

# 创建画布
plt.figure(figsize=(20,8),dpi=100)

# 绘制图像

## 计算数组【重要】
d = 3 # 组距
num_bins = (max(a) - min(a))//d#组数

## 绘制频数直方图
plt.hist(a, num_bins)

## 设置x轴刻度
plt.xticks(range(min(a),max(a)+d,d))#从min(a)max(a)+d之间每隔d隔取一个值作为刻度【重要】

## 显示网格
plt.grid(linestyle=':',alpha=0.5)

##设置标题
plt.title('六年级同学身高直方图')

#保存图像
plt.savefig('./六年级同学身高直方图.png')

#显示图像
plt.show()

5 饼图绘制

需求-失信用户的教育水平分布

失信用户的教育水平数据如下所示:
[0.2515,0.3724,0.3336,0.0368,0.0057]
[‘中专’,‘大专’,‘本科’,‘硕士’,‘其他’]

1 准备数据

edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']

2 绘制

plt.pie(x, labels=,autopct=,colors)

绘制饼图

代码:

#导入第三方模块
import matplotlib.pyplot as plt

#获取数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']

#创建图像
plt.figure(figsize=(20,8),dpi=100)

#设置中文
plt.rcParams['font.family'] = ['SimHei']

#绘制饼图
plt.pie(x = edu,#绘图数据
        labels = labels,#添加教育水平标签
        autopct = '%.1f%%'#设置百分比格式,且为浮点数,一个小数点
       )

#添加标题
plt.title('失信教育水平')

#保存图像
plt.savefig('./失信教育水平饼图.png')

#显示图像
plt.show()


图中是一个不加任何修饰的饼图,那么如何修饰饼图呢?

饼图的美化

<mark>美化</mark>

#导入第三方模块
import matplotlib.pyplot as plt

#获取数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']

#创建图像
plt.figure(figsize=(20,8),dpi=100)

# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')

#绘制饼图
plt.pie(x = edu,#绘图数据
        explode= [0,0.2,0,0,0] , # 突出显示大专人群,0.2偏离程度
        labels = labels,#添加教育水平标签
        colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] , # 设置饼图的自定义填充色
        autopct = '%.1f%%',#设置百分比格式,且为浮点数,一个小数点
        pctdistance=0.8,  # 设置百分比标签与圆心的距离
        labeldistance = 1.2, # 设置教育水平标签与圆心的距离
        startangle = 180, # 设置饼图的初始角度
        radius = 1.2, # 设置饼图的半径
        counterclock = False, # 是否逆时针,这里设置为顺时针方向
        wedgeprops = {
   'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
        textprops = {
   'fontsize':10, 'color':'black'}, # 设置文本标签的属性值
   )

#添加标题
plt.title('失信教育水平')

#保存图像
plt.savefig('./失信教育水平饼图.png')

#显示图像
plt.show()

6 小结

  • 折线图【知道】
    • 能够显示数据的变化趋势,反映事物的变化情况。(变化)
    • plt.plot()
  • 散点图【知道】
    • 判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
    • plt.scatter()
  • 柱状图【知道】
    • 绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
    • plt.bar(x, width, align=“center”)
  • 直方图【知道】
    • 绘制连续性的数据展示一组或者多组数据的分布状况(统计)
    • plt.hist(x, bins)
  • 饼图【知道】
    • 用于表示不同分类的占比情况,通过弧度大小来对比各种分类
    • plt.pie(x, labels, autopct, colors)