AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib

文章目录

  • Python 之 数据可视化模块 Matplotlib
    • 一、Matplotlib 开发环境搭建
    • 二、绘制基础
      • 1. 绘制直线
      • 2. 绘制折线
      • 3. 设置标签文字和线条粗细
      • 4. 绘制一元二次方程的曲线 y = x 2 y=x^2 y=x2
      • 5. 绘制正弦曲线和余弦曲线
    • 三、绘制散点图
    • 四、绘制柱状图
    • 五、绘制饼状图
    • 六、绘制直方图
    • 七、绘制等高线图
    • 八、绘制三维图

Python 之 数据可视化模块 Matplotlib

关于 Matplotlib:Matplotlib 是 Python 的库(数据可视化库),又是开发中常用的库。 Matplotlib 的功能强大,可以很容易与Numpy、Pandas 等程序库结合在一起使用。

Matplotlib 的功能:Matplotlib 是一个 Python 的 2D 绘图库。通过 Matplotlib,开发者可以仅需要几行代码,便可生成绘图,直方图,功率谱,条形图,错误图,散点图等。

使用 Matplotlib 好处:学习 Matplotlib,可让数据可视化,更直观的真实给用户。使数据更加客观、更具有说服力。

小贴士

  • 下文中多处使用到 Numpy 模块,若对其不熟悉,可先浏览:AI算法工程师 | 03人工智能基础-Python科学计算和可视化(一)Numpy

一、Matplotlib 开发环境搭建

说明

  • 如果使用的是 Anaconda Python 开发环境,那么 Matplotlib 已经被集成进 Anaconda,并不需要单独安装。(由于自己使用的是Miniconda Python 开发环境,需要单独安装 Matplotlib)
  • 如果使用的是标准的 Python 开发环境,可以使用命令安装 Matplotlib,语法格式:pip install matplotlib

测试与安装

若不清楚 Python 环境是否安装了 Matplotlib,可先测试

  • Windows电脑中按键 win + R 后输入“cmd” → 在 cmd 的命令窗口输入 python
  • 进入 python 环境中后,输入 import matplotlib 并回车 →
  • 若输入后提示模块没有找到“ModuleNotFoundError: No module named 'Matplotlib'”,说明未安装 Numpy;若什么都没显示,则说明已安装。
  • 注:输入 exit() 可退出 python 环境。

cmd 中使用 pip 命令安装 Matplotlib:(注意该命令是在 cmd 中,而非 python 环境中)

# 安装命令(不指定版本)
pip install matplotlib

# 注意:该安装方式相对简单,但可能存在当前 Matplotlib 版本与 Python 环境不兼容情况,不适用所有
# ——(相对谨慎的做法:根据当前的 python 版本选择对应适用的 Matplotlib 版本)

安装完成后,可以测试一下 Matplotlib 是否安装成功。下面是导入 matplotlib.pyplot 模块的语句,若不出错,说明 Matplotlib 已经安装成功了。如:(该语句是在 python 环境中输入)

# Pyplot 是 Matplotlib 的子库,是常用的绘图模块,且包含一系列绘图函数的相关函数,能很方便的让用户绘制出 2D 图表。
# Pyplot 是 Matplotlib 中常使用的库,所以经常需要导入它进行使用。

# 导入 matplotlib 的子模块 pyplot,并起别名为 plt
import matplotlib.pyplot as plt 

# 扩:这是查看 matplotlib 库的版本号的命令
import matplotlib
matplotlib.__version__

图示
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第1张图片
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第2张图片

二、绘制基础

在使用 Matplotlib 绘制图形时,其中有两个最为常用的场景:① 画点,② 画线

pyplot 基本方法:

方法名 说明
title() 设置图表的名称
xlabel() 设置 x 轴名称
ylabel() 设置 y 轴名称
xticks(x,ticks,rotation) 设置 x 轴的刻度,rotation 旋转角度
yticks() 设置 y 轴的刻度
plot() 绘制线性图表
show() 显示图表
legend() 显示图例
text(x,y,text) 显示每条数据的值(x,y 值的位置)
figure(name,figsize=(w,h),dpi=n) 设置图片大小

1. 绘制直线

关于直线的绘制

在使用 Matplotlib 绘制线性图时,其中最简单的是绘制线图。

以后续的使用 Matplotlib 绘制一个简单的直线的代码为例,其具体实现过程为:

  • ① 导入模块 pyplot,并给它指定别名 plt,以免反复输入 pyplot。在模块 pyplot 中包含很多用于生产图表的函数;
  • ② 将绘制的直线坐标传递给函数 plot()
  • ③ 通过函数 plt.show() 打开 Matplotlib 查看器,显示绘制的图形。

示例 - 绘制直线

  • 使用 matplotlib 根据两点绘制一条线
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 模块,并起别名为 plt

plt.plot([0,2],[1,3]) # 将(0,1)点和(2,3)连起来(plot 默认画直线图 )
plt.show() # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第3张图片

2. 绘制折线

示例 - 绘制折线

  • 使用 matplotlib 绘制折线图
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
squares=[1,4,9,16,25] # 平方数序列
plt.plot(x,squares) # 将5个点连接起来:(1,1) (2,4) (3,9) (4,16) (5,25)
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第4张图片

3. 设置标签文字和线条粗细

示例 - 设置样式

  • 使用 matplotlib 绘制折线图并设置样式
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(x,squares,linewidth=4) #设置线条宽度

#设置图标标题,并在坐标轴上添加标签
plt.title("数字",fontsize=18)
plt.xlabel('datas',fontsize=14)
plt.ylabel('squares',fontsize=14)

plt.show() # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第5张图片

  • 由上方结果可知,Matplotlib 默认情况不支持中文,简单的解决方法:在代码中添加一条语句plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签。SimHei(黑体)
import matplotlib.pyplot as plt

x=[1,2,3,4,5]
squares=[1,4,9,16,25]
plt.plot(x,squares,linewidth=4) #设置线条宽度

#设置图标标题,并在坐标轴上添加标签
plt.title("数字",fontsize=18)
plt.xlabel('datas',fontsize=14)
plt.ylabel('squares',fontsize=14)

plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签(中文乱码问题)

plt.show() # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第6张图片

4. 绘制一元二次方程的曲线 y = x 2 y=x^2 y=x2

Matplotlib 有很多函数用于绘制各种图形,其中 plot 函数用于曲线,需要将 200 个点的 x x x 坐标和 y y y 坐标分别以序列的形式传入 plot 函数,然后调用 show 函数显示绘制的图形——一元二次方程的曲线。

示例 - 绘制曲线

  • 使用 matplotlib 绘制一元二次方程曲线
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x]  # 生成 y 点的坐标:遍历x,把里面的每个元素进行平方

plt.plot(x,y)  #绘制一元二次曲线
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第7张图片

  • 设置完中文字符后,若坐标轴存在负数,则可能存在负号显示问题。解决方法:在代码中添加一条语句 plt.rcParams['axes.unicode_minus'] = False
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x]  # 生成 y 点的坐标

plt.plot(x,y)  #绘制一元二次曲线

plt.rcParams['axes.unicode_minus'] = False # 解决中文字体下坐标轴负数的负号显示问题

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第8张图片

  • 调用 savefig 可将绘制后的图形保存为图片:
    plt.savefig('name.jpg') # 括号中内容的含义:保存图片命名为 name.jpg
    plt.savefig('name') # 括号中内容的含义:保存图片命名为 name.png
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-100,100) # 200 个点的 x 坐标
y=[i*i for i in x]  # 生成 y 点的坐标

plt.plot(x,y)  #绘制一元二次曲线

plt.rcParams['axes.unicode_minus'] = False # 解决中文字体下坐标轴负数的负号显示问题

# 将绘制后的图形 保存 为图片

plt.savefig('result.jpg') # 可以保存图形(在脚本所在位置可以看到图片)
# plt.savefig('result')  # 会生成 result.png

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第9张图片
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第10张图片

5. 绘制正弦曲线和余弦曲线

使用 matplotlib 根据两点绘制一条线使用 plt 函数绘制任何曲线的第一步都是生成若干个坐标点(x,y),理论上坐标点是越多越好。

示例 - 绘制正弦、余弦曲线

  • 使用 matplotlib 绘制正弦曲线和余弦曲线
import matplotlib.pyplot as plt
import numpy as np

# 生成 x 的坐标(0-20 的 100 个等差数列)
x = np.linspace(0,20,100)  # linspace 用于创建一个一维数组(等差数列构成)

# 将 100 个 x 坐标值一起传入 Numpy 的 sin 和 cos 函数
sin_y = np.sin(x) 
cos_y = np.cos(x)

# 使用 plot 函数绘制正弦曲线和余弦曲线
plt.plot(x,sin_y)
plt.plot(x,cos_y)

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第11张图片

  • 其中,上方的使用 plot 函数绘制正弦曲线和余弦曲线,可合并成在一个plot 函数中
import matplotlib.pyplot as plt
import numpy as np

# 生成 x 的坐标(0-20 的 100 个等差数列)
x = np.linspace(0,20,100)  

# 将 100 个 x 坐标值一起传入 Numpy 的 sin 和 cos 函数
sin_y = np.sin(x) 
cos_y = np.cos(x)

# 使用 plot 函数绘制正弦曲线和余弦曲线

# 可直接plt.plot(x, sin_y)、plt.plot(x, cos_y)合写成如下语句
# 语句说明:在 plt.plot() 参数中包含两对 x,y 值,
# —— 第一对是 x,sin_y,(对应于正弦函数);第二对是 x,cos_y,(对应于正弦函数)
plt.plot(x,sin_y,x,cos_y) 

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第12张图片

  • 如果感觉展示的图形太小了,可以使用 figure 调整画布大小
# figure(name,figsize=(w,h),dpi=n)  设置图片大小
# 参数说明:
# name: 设置图像编号或名称(可选);
# figsize:设置画布的大小,单位为英寸(w:宽;h: 高);
# dpi: 指定绘图对象的分辨率(每英寸多少个像素),默认为80

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,20,100) # 生成 x 的坐标
sin_y = np.sin(x)
cos_y = np.cos(x)

# 使用画布调整大小
plt.figure(figsize=(8,5), dpi=80)  # 创建一个 8 * 5 点(point)的图,并设置分辨率为 80

plt.plot(x,sin_y,x,cos_y)  # 使用 plot 函数绘制正弦曲线和余弦曲线
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第13张图片
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第14张图片

小贴士

  • 关于 Matplotlib 中 pyplot 的 figure 函数的使用,可参考: Matplotlib之Figure的使用 by樊i
  • 前面的图形中,正弦曲线和余弦曲线都在同一个画布中。如果想要将它们分开展示,需要怎么做呢 ?
# subplot()函数将画布分区的使用

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,20,100) # 生成 x 的坐标

# 将画布分为 2 行 2 列:

plt.subplot(2,2,1) # 将图画到画布的 1 区域
plt.plot(x,np.sin(x))  # 绘制正弦曲线

plt.subplot(2,2,3) # 将图画到画布的 3 区域
plt.plot(x,np.sin(x))  # 绘制余弦曲线

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第15张图片

小贴士

  • 关于画布分区的详细介绍,可参考: 菜鸟教程——Matplotlib 绘制多图:subplot() 和 subplots() 方法

三、绘制散点图

使用 scatter 函数可以绘制随机点,该函数需要接收 x x x 坐标和 y y y 坐标的序列。

示例1 - 绘制散点图

  • 使用 matplotlib 绘制 sin() 函数的散点图
import matplotlib.pyplot as plt
import numpy as np

# 画散点图
x = np.linspace(0,10,100) # 生成0到10中100个等差数
plt.scatter(x,np.sin(x))
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第16张图片

  • 绘制 100 种大小 100 种颜色的散点图
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(66666) # 设定随机种子(每次执行结果一样)

x=np.random.rand(100) # 生成一百个随机点([0, 1)之间的均匀随机数)
y=np.random.rand(100)
colors=np.random.rand(100)
size=np.random.rand(100)*1000  # 乘以1000是为了让数值变大些

plt.scatter(x,y,c=colors,s=size,alpha=0.7) # alpha:透明度
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第17张图片
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第18张图片

示例2 - 绘制线

作为线性图的替代,可以通过向 plot() 函数添加格式字符串来显示离散值。

  • 绘制不同种类不同颜色的线
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,10,100) # 生成0到10中100个等差数

plt.plot(x,x+0,'-b') # 实线 蓝色
plt.plot(x,x+1,'--g') # 短横线 绿色
plt.plot(x,x+2,'-.y') # 点划线 黄色
plt.plot(x,x+3,':c') # 虚线 青色
plt.plot(x,x+4,'dr') # 窄菱形标记 红色
plt.plot(x,x+5,'o') # 圆标记 默认蓝色
plt.plot(x,x+6,'x') # 叉叉 默认橙色

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第19张图片

  • 上图中虽然绘制出了不同颜色的线,可是却不知其所代表的的内容。该如何改进呢?这时图例就站出来了!
import matplotlib.pyplot as plt
import numpy as np

# 不同种类不同颜色的线并添加图例

x = np.linspace(0,10,100) # 生成0到10中100个等差数

plt.plot(x,x+0,'-b',label='-b') # 实线 蓝色
plt.plot(x,x+1,'--g',label='--g') # 短横线 绿色
plt.plot(x,x+2,'-.y',label='-.y') # 点划线 黄色
plt.plot(x,x+3,':c',label=':c') # 虚线 青色
plt.plot(x,x+4,'dr',label='dr') # 窄菱形标记 红色
plt.plot(x,x+5,'o',label='o') # 圆标记 默认蓝色
plt.plot(x,x+6,'x',label='x') # 叉叉 默认橙色

# 添加图例(右下角lower right  左上角upper left) 边框  透明度  阴影  边框宽度
plt.legend(loc='lower right',fancybox=True,framealpha=1,shadow=True,borderpad=0.4)
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第20张图片

补充 - 可以使用的 格式化字符、颜色的缩写:
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第21张图片
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第22张图片

四、绘制柱状图

关于柱状图的绘制

使用 pyplot 中的 bar 函数可以绘制柱状图

  • 柱状图需要水平的 x x x 坐标值,以及每一个 x x x 坐标值对应的 y y y 坐标值,从而形成柱状的图;
  • 柱状图主要用来:纵向对比(如:pyplot.bar(x,y) # 竖直柱状图 )、横向对比(如:pyplot.barh(x,y) # 水平柱状图)。

语法格式:

# bar() 方法绘制柱形图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

"""
参数说明:
· x:柱形图的 x 轴数据
· height:柱形图的高度
· width:柱形图的宽度(默认 0.8)
· bottom:y 坐标(默认 0)
· align:柱形图与 x 坐标的对齐方式
		① 'center' 以 x 位置为中心(默认值);
		② 'edge':将柱形图的左边缘与 x 位置对齐;
		③ 若要对齐右边缘的条形:可传递负数的宽度值及 align='edge'。
· **kwargs:其他参数
"""

示例1 - 绘制柱状图

  • 使用 bar() 绘制柱状图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

x = [1980,1985,1990,1995]
y = [1000,3000,4000,5000]

plt.bar(x,y) # 绘制柱状图

plt.show() # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第23张图片

  • 上方通过几行代码,一个简单的柱形图就绘制成了。但看起来有些简陋,各坐标轴对应含义及图形要表达的内容均不知,此时可以给它润润色,让绘制的图看起来更丰富、直观些。
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# 数据
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]

# 绘制柱状图
plt.bar(x,y) 

# 润色(标签、名称、标题)
plt.xticks(x,x_labels) # 设置x轴替换标签
plt.xlabel('年份') # 显示 x 轴名称
plt.ylabel('销量')  # 显示 y 轴名称
plt.title('根据年份销量对比图') # 图的标题

# 将全局的字体设置为黑体 (使中文正常显示)
plt.rcParams['font.sans-serif']=['SimHei']  

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第24张图片

  • 还可以设置柱的宽度,更换颜色等
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# 数据
x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]

# 绘制柱状图(设置柱的宽度、颜色)
plt.bar(x,y,width=2,color="red") # 颜色也可用缩写,如:红色 color="r"

# 润色(标签、名称、标题)
plt.xticks(x,x_labels) # 设置x轴替换标签
plt.xlabel('年份') # 显示 x 轴名称
plt.ylabel('销量')  # 显示 y 轴名称
plt.title('根据年份销量对比图') # 图的标题

# 将全局的字体设置为黑体 (使中文正常显示)
plt.rcParams['font.sans-serif']=['SimHei']  
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第25张图片

示例2 - 绘制水平柱状图

  • 使用 barh() 绘制水平的柱形图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]

plt.barh(x,y) # 水平的柱子

plt.yticks(x,x_labels) # 设置y轴替换标签
plt.ylabel('年份')  # 显示 y 轴名称
plt.xlabel('销量') # 显示 x 轴名称
plt.title('根据年份销量对比图') # 图的标题

plt.rcParams['font.sans-serif']=['SimHei']  # 将全局的字体设置为黑体 (使中文正常显示)
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第26张图片

  • 注意:设置柱形图的宽度,barh() 中设置的是参数 height,而非 width
import matplotlib.pyplot as plt # 导入模块
import numpy as np

x = [1980,1985,1990,1995]
x_labels=['1980年','1985年','1990年','1995年']
y = [1000,3000,4000,5000]

plt.barh(x,y,height=2) # 水平的柱子,通过 hight 设置柱子的“宽度”

plt.yticks(x,x_labels) # 设置y轴替换标签
plt.ylabel('年份')  # 显示 y 轴名称
plt.xlabel('销量') # 显示 x 轴名称
plt.title('根据年份销量对比图') # 图的标题

plt.rcParams['font.sans-serif']=['SimHei']  # 将全局的字体设置为黑体 (使中文正常显示)
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第27张图片

  • 使用 bar() 和 barh() 绘制柱状图,并通过 subplot() 函数使画布分区展示
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# 数据
np.random.seed(6)
x=np.arange(5)
y=np.random.randint(-5,5,5)
print(x,y)

# 左侧绘竖直柱状图
plt.subplot(1,2,1) # 将画布分隔成 一行两列,在左侧画(第一列画)
v_bar=plt.bar(x,y) # 在第一列中画图
plt.axhline(0,color='blue',linewidth=2) # 在第一列的画布中 0位置画一条蓝线

# 右侧绘水平柱状图
plt.subplot(1,2,2) # 在右侧画(第二列画)
h_bar=plt.barh(x,y,color='red') # barh 将y和x轴对换 竖着方向为 x 轴
plt.axvline(0,color='red',linewidth=2) # 在第二列的画布中0位置处画红色的线

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第28张图片

示例3 - 综合

  • 绘制上映三天的四部影片的单日票房变化
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# 数据
names=['唐人街探案3','捉妖记2','中国机长','你好,李焕英']
y_num1=[10.11,8.18,7.5]
y_num2=[5.47,3.73,2.85]
y_num3=[2.09,2.61,2.87]
y_num4=[2.91,3.02,4.56]

# 生成 x  第1天   第2天   第3天
x=np.arange(len(y_num1)) # 求有多少天,并生成一个序列
print(x)
x_label=['第{}天'.format(i+1) for i in range(len(y_num1))] # 遍历
print(x_label)

# 绘制柱状图

plt.figure(figsize=[8,6], dpi=80)  # 设置图形大小

width=0.2 # 设置单个柱状图宽度
plt.bar(x,y_num1,color='#ff7f50',width=width,label=names[0])
plt.bar([i+width for i in x],y_num2,color='#87cefa',width=width,label=names[1])
plt.bar([i+2*width for i in x],y_num3,color='#DA70D6',width=width,label=names[2])
plt.bar([i+3*width for i in x],y_num4,color='#32CD32',width=width,label=names[3])

# 将全局的字体设置为黑体
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

# 设置 x轴、y轴
plt.xticks([i+(3*width)/2 for i in x],x_label)# index+3*width/2 使得标签居中显示
plt.xlabel('上映天数', size=12) # 显示 x 轴名称
plt.ylabel('票房数(单位:亿)', size=12)  # 显示 y 轴名称

# 设置图例及标题属性
plt.legend() # 添加图例(默认右上角)
plt.title('上映3天的影片单日票房数', size=16) # 添加标题

plt.savefig('票房对比.jpg') # 保存图形(在脚本所在位置可以看到图片)
plt.show()  # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第29张图片

代码参考:Python绘制并列柱状图
数据来源:https://ys.endata.cn/BoxOffice/Ranking

说明 - 关于bar 函数中的 width 参数

需要注意的是 bar 函数的宽度并不是像素宽度!

  • bar 函数会根据二维坐标系的尺寸,以及 x 坐标值的多少,自动确定每一个柱的宽度,而 width 指定的宽度就是这个标准柱宽度的倍数;
  • 该参数值可以是浮点数,如 0.5,表示柱的宽度是标准宽度的 0.5 倍。

示例:感受同一 width 值带来的不同宽度
AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第30张图片

小贴士

  • 设置柱形图的宽度:① bar 函数使用 width 设置;② barh 函数使用 height 设置 height
  • bar 函数中的 width:其宽度并不是像素宽度,width 指定的宽度是通过计算得到的标准柱宽度的倍数。(同样的,barh 函数中的 height 也是如此)

五、绘制饼状图

pie 函数可以绘制饼状图,饼图主要是用来呈现比例的。只要传入比例数据即可。

示例 - 绘制饼状图

  • 绘制简单的饼状图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

nums = np.array([12, 22, 6, 18]) 
plt.pie(nums) # 传入数据,绘制饼图
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第31张图片

  • 饼状图之男女比例占比
import matplotlib.pyplot as plt # 导入模块

# 数据(男、女人数及比例)
man = 88888
woman =  66666
man_perc = man/(man+woman)
woman_perc = woman/(man+woman)

labels = ['男','女'] # 标签
colors = ['blue','red'] # 颜色

# 设置字体(用来正常显示中文标签)
plt.rcParams['font.sans-serif']=['SimHei']

# 绘制饼状图

# labels:标签名称 colors:颜色,explode:分裂程度  autopct:显示百分比
paches,texts,autotexts = plt.pie([man_perc,woman_perc],labels=labels,
                                 colors=colors,explode=(0,0.1),autopct='%0.1f%%')

for text in autotexts: # 遍历,设置饼状图中的字体颜色
    text.set_color('white')
    
for text in texts+autotexts: # 设置字体大小
    text.set_fontsize(18)

plt.show() # 展示图形

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第32张图片

六、绘制直方图

直方图与柱状图都是由若干个柱组成,其分格类似,但含义不同:

  • 直方图:用来观察分布状态(关注的是分布,并不关心具体的某个值)
  • 柱状图:用来看每一个 x x x 坐标对应的 y y y 的值(关心的是具体的某个值)

使用 hist 函数可绘制直方图(Histogram)。

示例 - 绘制直方图

  • 使用 hist() 绘制直方图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

x = np.random.randn(1000) # 生成1000个值(标准正态分布)
plt.hist(x) # 绘制直方图(1000个值 会按照 x 轴分割,分成10个组,每组求平均值)

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第33张图片

  • 若是想让直方图的柱数更多,可通过参数 bins 实现
import matplotlib.pyplot as plt # 导入模块
import numpy as np

x = np.random.randn(1000) # 生成1000个值(标准正态分布)
# plt.hist(x)  # (1000个值 会按照 x 轴分割,分成10个组,每组求平均值)
plt.hist(x, bins=100) # 装箱(bins 柱数,默认10,此处设置100:分成100份,使每个柱看起来更平滑)

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第34张图片

  • 同一画布绘制三个直方图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# normal:正太分布 (第一个参数 loc:期望)(第二个 scale:方差) (第三个 size 形状)
x1=np.random.normal(0,0.8,1000)
x2=np.random.normal(-2,1,1000)
x3=np.random.normal(3,2,1000)

# 参数 bins:装箱,alpha:透明度
kwargs=dict(bins=100,alpha=0.4) # 设置字典

plt.hist(x1,**kwargs) # **kwargs:以字典的形式传参 
plt.hist(x2,**kwargs)
plt.hist(x3,**kwargs)

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第35张图片

小贴士

  • 由于使用的 Jupyter Notebook 编写的代码,所以最后省略 plt.show() 这一步也可展示图形。
  • 当然,若是无法显示图形,可在代码开头写上 %matplotlib inline ,其功能为:可以内嵌绘图。 (注意:该语句对其他工具,如 pycharm 不适用)

七、绘制等高线图

等高线图实际上是个三维图形,有 x , y , z x,y,z x,y,z 轴。而呈现的是俯视效果,即:将三维映射到二维中画图。

示例 - 绘制等高线图

  • 使用 matplotlib 绘制等高线图
import matplotlib.pyplot as plt # 导入模块
import numpy as np

# 生成数据
x = np.linspace(-10,10,100) # 等份切分,根据 linspace 找到100个点
y = np.linspace(-10,10,100)

X,Y = np.meshgrid(x,y) # 计算 x 和 y 的相交点 a(网格线)
print(X.shape,Y.shape) # 查看 X 和 Y 的形状

Z = np.sqrt(X**2+Y**2) # 计算 Z 的坐标
print(Z.shape) # 查看 Z 的形状

# 画等高线图
plt.contourf(X,Y,Z) 

# 图形中:颜色越深表示值越小,中间的黑色表示 z=0

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第36张图片

  • 通过 contour 可绘制不填充颜色的等高线图
# 使用的是上方的数据
plt.contour(X,Y,Z) # 画等高线图,但不填充颜色

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第37张图片

八、绘制三维图

使用 pyplot 包和 Matplotlib 绘制三维图。

示例 - 绘制三维图

  • 使用 Matplotlib 绘制三维图
import matplotlib.pyplot as plt # 导入模块
from mpl_toolkits.mplot3d import Axes3D # 导入 3D 包

# 创建 X、Y、Z 坐标
X=[1,1,2,2]
Y=[3,4,4,3]
Z=[1,100,1,1]

fig = plt.figure() # 创建画布
ax = Axes3D(fig) # 创建了一个 Axes3D 的子图放到 figure 画布里
ax.plot_trisurf(X, Y, Z) # 绘制3D曲面

plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第38张图片

  • 上方的代码虽然展示出来了图形,但出现了警告,优化如下:
import matplotlib.pyplot as plt # 导入模块
from mpl_toolkits.mplot3d import Axes3D # 导入 3D 包

# 创建 X、Y、Z 坐标
X=[1,1,2,2]
Y=[3,4,4,3]
Z=[1,100,1,1]

fig = plt.figure() # 创建画布

# ax = Axes3D(fig) # 创建了一个 Axes3D 的子图放到 figure 画布里
ax = Axes3D(fig,auto_add_to_figure=False)
fig.add_axes(ax)

ax.plot_trisurf(X, Y, Z) # 绘制3D曲面
plt.show()

AI算法工程师 | 03人工智能基础-Python科学计算和可视化(二)Matplotlib_第39张图片


—— 说明:本文内容基于python3,使用工具 Jupyter Notebook 编写的代码
(本文写于 2022.7.24 ~ 7.30)

你可能感兴趣的:(AI算法工程师,python,matplotlib,人工智能)