matplotlib图形对象

0. 图形窗口

plt.figure(
	'',					# 窗口标题栏
	figsize=(80, 20),	# 窗口大小
	dpi=80,				# 像素密度
	facecolor=''		# 图表背景颜色
)
plt.show()
  • 当前窗口相关参数
# 图表标题
plt.title(title, fontsize=12)
# 设置水平轴文本
plt.xlabel(x_label_str, fontsize=12)
# 设置垂直轴文本
plt.xlabel(y_label_str, fontsize=12)
# 设置刻度参数 labelsize设置刻度字体大小
plt.tick_params(..., labelsize=8, ...)
# 设置图表网格线 linestyle设置网格线样式
"""
-	or	solid	粗线
--	or	dashed	虚线
-.	or	dashdot	点虚线
:	or	dotted	点线
"""
plt.grid(liestyle='')
# 设置紧促布局,把图表相关的参数都显示在窗口中
plt.tight_layout()
  • 在当前窗口构建多个窗口,窗口名不能相同,否则会覆盖
plt.figure('testA', facecolor='red')
plt.figure('testB', facecolor='blue')
plt.figure('testC', facecolor='yellow')
plt.figure('testD', facecolor='green')

plt.title('testA', fo)
plt.show()

1. 子图

  1. 矩阵式布局
from matplotlib import pyplot as plt
plt.figure('Subplot Layout', facecolor='lightgray')
"""
拆分矩阵
	rows: 行数
	cols: 列数
	num: 编号
"""

plt.subplot(rows, cols, num)
plt.subplot(3, 3, 5)	# 操作3*3的矩阵中编号为5的子图
plt.subplt(335)			# 简写
# 在编号为5的子图中绘制
plt.polot()

# 在编号为3的子图中绘制
plt.subplot(3, 3, 3)
plt.plot()
  • 示例
from matplotlib import pyplot as plt

plt.figure('Subplot', facecolor='lightgray')

for i in range(1, 10):
    plt.subplot(3, 3, i)
    """
    text  显示文本
    
	0.5	横坐标
	0.5 纵坐标
	i   显示文本
	size 文本字体大小
	ha  水平居中
	va	垂直居中
	"""
    plt.text(0.5, 0.5, i, size=36, ha='center', va='center')

    # 去掉刻度
    plt.xticks([])
    plt.yticks([])

    # 使布局紧促
    plt.tight_layout()

plt.show()

在这里插入图片描述

  1. 网格式布局
from matplotlib import pyplot as plt
from  matplotlib import gridspec as mg

plt.figure('Grid Layout', facecolor='lightgray')
"""
调用GridSpec方法差分网格式布局
rows 行数
cols 列数
gs = mg.GridSpec(rows, cols)  拆分成3行3列
"""
gs = mg.GridSpec(3, 3)
# 合并0行与0、1列作为一个子图表
plt.subplot(gs[0, :2])
plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

# 合并0、1行的1、2列
plt.subplot(gs[:2, 2:3])
plt.text(0.5, 0.5, '2', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

# 合并1、2行的第0列
plt.subplot(gs[1:3, 0])
plt.text(0.5, 0.5, '4', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

# 合并2行的1、2列
plt.subplot(gs[2, 1:3])
plt.text(0.5, 0.5, '5', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

# 中心填充2行2列
plt.subplot(gs[1, 1])
plt.text(0.5, 0.5, '3', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

# 紧促布局
plt.tight_layout()

plt.show()

在这里插入图片描述

  1. 自由布局
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from matplotlib import pyplot as plt

plt.figure('Free Layout', facecolor='lightgray')
# 设置图标的位置,给出左下角点坐标与宽度即可
# left_bottom_x: 左下角点x坐标
# left_bottom_y: 左下角点y坐标
# width: 宽度
# height: 高度
# plt.axes([left_bottom_x, left_bottom_y, width, height])
plt.axes([0.1, 0.1, 0.3, 0.4])
plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

plt.axes([0.1, 0.5, 1.0, 0.5])
plt.text(0.5, 0.5, '2', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

plt.axes([0.4, 0.1, 0.7, 0.4])
plt.text(0.5, 0.5, '3', ha='center', va='center', size=36)
# 去掉刻度
plt.xticks([])
plt.yticks([])

plt.show()

在这里插入图片描述

2. 刻度定位器

# 获取当前坐标轴
ax = plt.gca()

# 设置水平坐标轴的主刻度定位器
ax.xaxis.set_major_localtor(plt.NullLocator())

# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(plt.MultipileLocator())
  • 案例:绘制一个数轴
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from matplotlib import pyplot as plt


plt.figure('Locators', facecolor='lightgray')

# 获取当前坐标轴
ax = plt.gca()

# 隐藏除底轴以外的所有坐标轴
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')

# 隐藏y轴坐标
plt.yticks([])

# 修改x轴坐标
plt.xlim(1, 10)

# 将底坐标轴调整到子图中心位置
ax.spines['bottom'].set_position('center')

# 设置主刻度定位器
ma_loc = plt.MultipleLocator(1)
ax.xaxis.set_major_locator(ma_loc)

# 设置次刻度定位器
mi_loc = plt.MultipleLocator(0.1)
ax.xaxis.set_minor_locator(mi_loc)

plt.show()

在这里插入图片描述

  • 常用刻度定位器
# 空定位器
plt.NullLocator()

# 最大值定位器
# 最多绘制 nbins + 1 个刻度,假如10个刻度,最多只能设置9个nbins
plt.MaxNLocator(nbins=3)

# 定点定位器,根据locs参数中的位置绘制刻度
plt.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])

# 自动定位器,由系统自动选择刻度的绘制位置
plt.AutoLocator()

# 索引定位器,由offset确定起始刻度,由base确定相邻刻度的间隔
plt.IndexLocator(offset=0.5, base=1.5)

# 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
plt.MultipleLocator()

# 线性定位器:等分numticks-1份,绘制numticks个刻度
plt.LinearLocator(numticks=21)

# 对数定位器:以base为底,绘制刻度
plt.LogLocator(base=2)

3. 刻度网格线

ax = plt.gca()

# 绘制刻度网格线
ax.grid(
	which='',  # 'major'/'minor'  <----->  '主刻度'/'次刻度'
	axis='',  # 'x'/'y'/'both'  <----->  绘制x轴/y轴/x和y轴
	linewidth=1,  # 线宽
	linestyle='',  # 线型
	color='',  # 颜色
	alpha=0.5  # 透明度  
)

4. 半对数坐标

  • y轴将以指数方式递增,基于半对数坐标绘制第二个子图,表示曲线【1, 10, 100, 1000, 100, 10, 1】
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from matplotlib import pyplot as plt


plt.figure('semilogy', facecolor='lightgray')

y = [1, 10, 100, 1000, 100, 10, 1]

ax = plt.gca()

# 绘制刻度网格线
ax.grid(which='major', axis='both', linewidth=1, linestyle='-.', color='red', alpha=0.5)

plt.semilogy(y)
plt.show()

在这里插入图片描述

5. 散点图

  • 可以通过每个点的坐标颜色大小形状表示不同的特征值。
身高体重性别年龄段种族
18080中年亚洲
16050青年美洲
  • 绘制散点图相关API
from __future__ import unicode_literals
from matplotlib import pyplot as plt


plt.scatter(
	x,	# x轴坐标数组
	y,	# y轴坐标数组
	marker='',	# 点型
	s=10,	# 大小
	color='',	# 颜色
	edgecolor='',	# 边缘颜色
	facecolor='',	# 填充色
	zorder=''	# 图层序号
)
  • numpy.random提供了normal函数,用于产生符合正态分布的随机数
n = 100
# 期望值 172
# 标准差 10
# 数组个数
x = np.random.normal(172, 20, n)	# 身高
y = np.random.normal(60, 10, n)		# 体重
  • 案例:绘制平面散点图
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from matplotlib import pyplot as plt
import numpy as np

n = 300
x = np.random.normal(172, 20, n)  # 身高
y = np.random.normal(60, 10, n)	 # 体重

plt.figure('Persons', facecolor='lightgray')
plt.title('Persons')
plt.xlabel('Height', fontsize=16)
plt.ylabel('Weight', fontsize=14)
plt.grid(linestyle=':')

d = (x - 172)**2 + (y - 60) ** 2
plt.scatter(x, y, marker='o', s=70,
            label='Persons', c=d, cmap='jet')
plt.legend()

plt.show()
  • (x - 172)**2代表300个身高到期望值的差距
  • (y - 60) ** 2代表300个体重到期望值的差距
  • 取平方是为了避免出现负值,也可取绝对值
  • 二者相加求得该个体距离标准身高体重的误差,值越小距离标准身高体重越近。
  • cmap代表颜色映射,jet代表颜色从蓝到红(值从小到大),拼接_n代表反转,比如:jet_n代表颜色从蓝到红(值从大到小)

在这里插入图片描述

6. 填充

  • 以某种颜色自动填充两条曲线的闭合区域。
from matplotlib import pyplot as plt

plt.fill_between(
    x,  # x轴水平坐标
    sin_x,  # 下边界曲线上点的垂直坐标
    cos_x,  # 上边界曲线上点的垂直坐标
    sinx_<cos_x,  # 填充条件
    color='',   # 填充颜色
    alpha=0.2   # 透明度
)
  • 案例:绘制两条曲线:sin_x = sin(x) cos_x = cos(x/2) / 2 [0-8π]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from matplotlib import pyplot as plt
import numpy as np


n = 1000
# 在0-8π范围内绘制1000个点
x = np.linspace(0, 8 * np.pi, n)
# 绘制sin_x = sin(x)曲线
sinx = np.sin(x)
# 绘制cos_x = cos(x/2) / 2曲线
cosx = np.cos(x / 2) / 2

# 窗体属性
plt.figure('Fill', facecolor='lightgray')
plt.title('Fill', fontsize=20)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')

# 绘图
plt.plot(x, sinx, c='dodgerblue', label='sin(x)')
plt.plot(x, cosx, c='orange', label='cos(x)')
plt.legend()

# 填充
plt.fill_between(
    x,  # x轴水平坐标
    sinx,  # 下边界曲线上点的垂直坐标
    cosx,  # 上边界曲线上点的垂直坐标
    sinx < cosx,  # 填充条件
    color='green',   # 填充颜色
    alpha=0.2   # 透明度
)

plt.fill_between(
    x,  # x轴水平坐标
    sinx,  # 下边界曲线上点的垂直坐标
    cosx,  # 上边界曲线上点的垂直坐标
    sinx > cosx,  # 填充条件
    color='pink',   # 填充颜色
    alpha=0.2   # 透明度
)

# 展示
plt.show()

在这里插入图片描述

7. 条形图(柱状图)

  • 绘制条形图基本API
from matplotlib import pyplot as plt

plt.figure('Bar', facecolor='lightgray')
plt.bar(
    x,  # 水平坐标数组
    y,  # 柱状图高度数组,可设置为负数,在水平轴下方显示
    width,  # 柱宽
    color,  # 填充颜色
    label,  # 图例
    alpha=0.2  # 透明度
)
  • 案例:先以柱状图绘制近12个月苹果的销量,然后再绘制橘子的销量
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


apples = np.array(
    [42, 34, 22, 31, 40, 54, 23, 42, 35, 47, 59, 50]
)

oranges = np.array(
    [20, 31, 34, 29, 42, 50, 37, 29, 39, 41, 30, 22]
)

# 设置条形图间距
bar_width = 0.2

# x轴
x_ = range(1, 13)

# 将柱状图像左移动柱宽的一半(这样一来就不用调整x轴刻度显示位置了)
a_x = [w-bar_width/2 for w in x_]

# 设置图形窗口信息
plt.figure('Bar', facecolor='lightgray')
plt.title('Fruit sale volume')
plt.xlabel('Month', fontsize=14)
plt.ylabel('Sale Volume', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(axis='y', linestyle=':')

# 绘制苹果销量图
plt.bar(
    a_x,  # 水平坐标数组
    apples,  # 柱状图高度数组
    width=bar_width,  # 柱宽
    color='red',  # 填充颜色
    label='apple',  # 图例
    alpha=0.2  # 透明度
)

# 在柱状图顶部显示高度
"""
plt.text(
    x,  显示位置的横坐标 
    y+5, 显示位置的纵坐标(显示位置高于柱子高度5个点)
    '%s' % y,  显示文本值(字符型)
    ha='center',  水平对齐方式
    va='top'  垂直对齐方式
)
"""
for x, y in zip(a_x, apples):
    plt.text(x, y+5, '%s' % y, ha='center', va='top')

# 将柱状图向右移动柱宽的一半(这样一来就不用调整x轴刻度显示位置了)
o_x = [w+bar_width/2 for w in x_]

plt.bar(
    o_x,  # 水平坐标数组
    oranges,  # 柱状图高度数组
    width=bar_width,  # 柱宽
    color='orange',  # 填充颜色
    label='orange',  # 图例
    alpha=0.2  # 透明度
)

for x, y in zip(o_x, oranges):
    plt.text(x, y+5, '%s' % y, ha='center', va='top')

# 使x轴刻度显示全
plt.xticks(x_)

# 显示图例
plt.legend()
plt.show()

在这里插入图片描述

8. 饼图

  • 绘制饼状图基本API
plt.pie(
    values,  # 值列表
    spaces,  # 扇形之间的距离列表
    labels,  # 标签颜色
    colors,  # 颜色列表
    '%d%%',  # 标签所占比例格式
    shadow=True,  # 是否显示阴影
    startangle=90,  # 逆时针绘制饼状图时的起始角度
    radius=1,  # 半径
)
  • 案例:用饼状图显示5门语言的流行程度
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


# 数据信息
labels = ['Python', 'JavaScript', 'C++', 'Java', 'PHP']
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
colors = ['dodgerblue', 'orangered', 'limegreen', 'violet', 'gold']

plt.figure('pie', facecolor='lightgray')
plt.title('Pie', fontsize=20)

plt.pie(
    x=values,  # 值列表
    explode=spaces,  # 扇形之间的距离列表
    labels=labels,  # 标签颜色
    colors=colors,  # 颜色列表
    autopct='%.2f%%',  # 标签所占比例格式
    shadow=True,  # 是否显示阴影
    startangle=0,  # 逆时针绘制饼状图时的起始角度
    radius=0.7,  # 半径
)

# 等轴比例
plt.axis('equal')

plt.legend(loc=0)
plt.show()

在这里插入图片描述

9. 等高线图

  • 组成等高线需要网络点坐标矩阵,也要每个点的高度,所以等高线属于3D数学模型范畴
  • 绘制等高线的相关API
cntr = plt.contour(
    x,  # 网格坐标矩阵的x坐标(2维数组)
    y,  # 网格坐标矩阵的y坐标(2维数组)
    z,  # 网格坐标矩阵的z坐标(2维数组)
    8,  # 把等高线绘制成8部分
    colors='black',  # 等高线的颜色
    linewidths=0.5,  # 线宽
)
# 绘制等高线的高度标签文本
plt.clabel(cntr, inline_spacing=1, fmt='%.2f', fontsize=10)
# 填充等高线
plt.contourf(x, y, z, 8, cmap='jet')
"""
x:
0 1 2 3
0 1 2 3
0 1 2 3
0 1 2 3

y:
0 0 0 0 
1 1 1 1
2 2 2 2 
3 3 3 3

z:
9 3 5 2
7 9 4 2
8 3 7 4
5 9 7 8
"""
  • 案例:生成网格坐标矩阵,并且绘制等高线图
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


# 整理数据 linspace:将-3到3拆分成n个点,组成一个二维数组
"""
例如 n = 5
[[-3.  -1.5  0.   1.5  3. ]
 [-3.  -1.5  0.   1.5  3. ]
 [-3.  -1.5  0.   1.5  3. ]
 [-3.  -1.5  0.   1.5  3. ]
 [-3.  -1.5  0.   1.5  3. ]]
"""
n = 500
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# 计算出每个坐标点的高度
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

# 绘制等高线
plt.figure('Contour', facecolor='lightgray')
plt.title('Contour', fontsize=18)
plt.grid(linestyle=':')
cntr = plt.contour(
    x,  # 网格坐标矩阵的x坐标(2维数组)
    y,  # 网格坐标矩阵的y坐标(2维数组)
    z,  # 网格坐标矩阵的z坐标(2维数组)
    8,  # 把等高线绘制成8部分
    colors='black',  # 等高线的颜色
    linewidths=0.5,
)

# 绘制等高线的高度标签文本
plt.clabel(cntr, inline_spacing=1, fmt='%.2f', fontsize=10)
"""
inline_spacing 线条上数字与线条的距离
"""

# 填充等高线
plt.contourf(x, y, z, 8, cmap='jet')

plt.show()

在这里插入图片描述

10. 热成像图

  • 用图形方式显示矩阵及矩阵中值的大小
1 2 3
4 5 6
7 8 9
  • 绘制热成像图的相关API
# 把矩阵z图形化,使用cmap表示矩阵中的每个元素值的大小
# origin:坐标轴方向
"""
upper: 缺省值,原点在左上方
lower: 原点在左下角
"""

plt.imshow(z, cmap='jet', origin='lower')
  • 使用颜色条显示热度值
plt.colorbar()
  • 案例:生成网格坐标矩阵,并且绘制热成像图
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt

# 整理数据
n = 500
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# 计算出每个坐标点的高度
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

# # 绘制热力图
plt.figure('Imshow', facecolor='lightgray')
plt.title('Imshow', fontsize=18)
plt.grid(linestyle=':')
plt.imshow(z, cmap='jet')

# 显示颜色条
plt.colorbar()

plt.show()

在这里插入图片描述

11. 极坐标系

  • 与笛卡尔坐标系不同,某些情况下极坐标系更适合显示与角度有关的图像,例如:雷达等。极坐标系可以描述极径 ρ \rho ρ与极角 θ \theta θ的线性关系
plt.figure('Polar', facecolor='lightgray')
plt.gca(projection='polar')
plt.title('Polar', fontsize=20)
plt.xlabel(r'$\rho$', fontsize=14)
plt.ylabel(r'$\theta$', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.show()
  • 极坐标系中绘制曲线
t = np.linspace(0, 4*np.pi, 1000)
r = 0.8 * t
plt.plot(t, r)
plt.show()
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


plt.figure('Polar', facecolor='lightgray')
# 极坐标系
plt.gca(projection='polar')
plt.title('Polar', fontsize=20)
plt.xlabel(r'$\rho$', fontsize=14)
plt.ylabel(r'$\theta$', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')

# 准备数据
t = np.linspace(0, 4*np.pi, 1000)

# 极径与极较之间的关系
r = 0.8 * t
plt.plot(t, r)

plt.show()

在这里插入图片描述

  • 我们可以看出,随着极角的增大,极径在变长
  • 案例:在极坐标系中绘制正弦函数。y = 3sin(6x)
x = np.linspace(0, 6**np.pi, 1000)
y = 3*np.sin(6*x)

plt.shpw()

在这里插入图片描述

12. 三维曲面(3D图像绘制)

  • matplotlib支持绘制三维曲面,若希望绘制三维曲面,需要使用axes3d提供的3d坐标
from mpl_toolkits.mplot3d import axes3d

ax3d = plt.gca(projection='3d')  # class axes3d
  • matplotlib支持绘制三维点阵、三维曲面、三维线框图
ax3d.scatter(..)  # 绘制三维点阵
ax3d.plot_surface(..)  # 绘制三维曲面
ax3d.plot_wireframe(..)  # 绘制三维线框图
  • 3d散点图的绘制相关API
ax3d.scatter(
	x,	# x轴坐标数组
	y,	# y轴坐标数组
	marker,	 # 点型
	s,	# 大小
	zorder,	 # 图层序号
	color,  # 颜色	
	edgecolor,  # 边缘颜色
	facecolor,  # 填充色
	c=v,  # 颜色值,根据cmap映射应用相应的颜色
	cmap=''
)
  • 案例:随机生成三组坐标,成标准状态分布规则,并且绘制他们
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt

n = 500
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)

# 绘制三维散点图
plt.figure('3D Scatter', facecolor='lightgray')
ax3d = plt.gca(projection='3d')  # class axes3d

ax3d.set_xlabel('x', fontsize=16)
ax3d.set_ylabel('y', fontsize=16)
ax3d.set_zlabel('z', fontsize=16)

# 根据每个点到三维坐标原点的距离做颜色映射
# jet从蓝到红,数越小越偏蓝
d = x**2 + y**2 + z**2
ax3d.scatter(x, y, z, marker='o', s=70,
             c=d, alpha=0.5, cmap='jet')

plt.tight_layout()
plt.show()

在这里插入图片描述

  • 3d平面图的绘制相关API
ax3d.plot_surface(
	x,  # 网格坐标矩阵的x坐标(2维数组)
	y,  # 网格坐标矩阵的y坐标(2维数组)
	z,  # 网格坐标矩阵的z坐标(2维数组)
	rstride,  # 行跨距,像素点宽度,越小画面越细腻
	cstride,  # 列跨距,像素点高度,越小画面越细腻
	cmap='jet'  # 颜色映射
)
  • 案例:绘制3d平面图
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


n = 500
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# 计算出每个坐标点的高度
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

plt.figure('3D Scatter', facecolor='lightgray')
plt.title('3D Scatter', fontsize=18)

ax3d = plt.gca(projection='3d')
ax3d.set_xlabel('x', fontsize=16)
ax3d.set_ylabel('y', fontsize=16)
ax3d.set_zlabel('z', fontsize=16)

ax3d.plot_surface(x, y, z, rstride=30, cstride=30, cmap='jet')

plt.tight_layout()
plt.show()

在这里插入图片描述

  • 3d线框图绘制相关API
ax3d.plot_wireframe(
	x,  # 网格坐标矩阵的x坐标(2维数组)
	y,  # 网格坐标矩阵的y坐标(2维数组)
	z,  # 网格坐标矩阵的z坐标(2维数组)
	rstride,  # 行跨距,像素点宽度,越小画面越细腻
	cstride,  # 列跨距,像素点高度,越小画面越细腻
	linewidth=1,  # 线宽
	color='dodgerblue'  # 线色
) 
  • 案例:3d线框图的绘制
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
from matplotlib import pyplot as plt


n = 500
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))

# 计算出每个坐标点的高度
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)

plt.figure('3D Scatter', facecolor='lightgray')
plt.title('3D Scatter', fontsize=18)

ax3d = plt.gca(projection='3d')
ax3d.set_xlabel('x', fontsize=16)
ax3d.set_ylabel('y', fontsize=16)
ax3d.set_zlabel('z', fontsize=16)

ax3d.plot_wireframe(
    x,  # 网格坐标矩阵的x坐标(2维数组)
    y,  # 网格坐标矩阵的y坐标(2维数组)
    z,  # 网格坐标矩阵的z坐标(2维数组)
    rstride=10,  # 行跨距,像素点宽度,越小画面越细腻
    cstride=10,  # 列跨距,像素点高度,越小画面越细腻
    linewidth=1,  # 线宽
    color='dodgerblue'  # 线色
)

plt.tight_layout()
plt.show()

在这里插入图片描述

13. 简单动画

  • 动画即在一段时间内快速连续的绘制图像
  • matplotlib提供了方法用于处理简单的动画绘制。定义update函数用于及时更新图像
from matplotlib import pyplot as plt
from matplotlib import animation as ma

# 定义更新函数行为
def update(number):
	pass

# 每隔10秒执行一次update更新函数,作用于plt.gca()当前窗口对象
# mp.gcf(): 获取当前窗口
# update: 更新函数
# interval: 间隔时间(单位: 毫秒)
anim = ma.FuncAnimation(plt.gcf(), update, interval=10)
plt.show()
  • 案例:随机生成100个各种颜色的气泡,让其不断增大
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation as ma


# 初始化构建所有样本
n = 100
balls = np.zeros(n, dtype=[
		('position', float, 2),
		('size', float, 1),
		('growth', float, 1),
		('color', float, 4)
	]

)
"""
# 每组样本数据如下
#  位置   大小  生长速度  颜色
([0., 0.], 0., 0., [0., 0., 0., 0.])
"""

# 在0-1的范围内生成100行2列的二维数组 uniform:均匀分布
balls['position'] = np.random.uniform(0, 1, (n, 2))
balls['size'] = np.random.uniform(40, 50, n)
balls['growth'] = np.random.uniform(10, 20, n)
balls['color'] = np.random.uniform(0, 1, (n, 4))

# 绘制图像
plt.figure('Bubble', facecolor='lightgray')
plt.title('Bubble', fontsize=16)

sc = plt.scatter(balls['position'][:, 0],
				 balls['position'][:, 1],
				 balls['size'],
				 color=balls['color'])
			
# 实现动画

def update(number):
	# 让每个点随时间增大
	balls['size'] += balls['growth']
	
	# 重新初始化点的大小
	index = number % 100
	balls['size'][index] = np.random.uniform(40, 50, 1)
	
	# 重新生成位置
	balls['position'][index] = np.random.uniform(0, 1, (1, 2))
	
	# 更新界面
	sc.set_sizes(balls['size'])
	sc.set_offsets(balls['position'])
			
# 每隔30秒,执行一次update函数
anim = ma.FuncAnimation(plt.gcf(), update, interval=30)
			
plt.show()

在这里插入图片描述

  • 使用生成器函数提供数据,实现动画绘制
  • 在很多情况下,绘制动画的参数是随机获取的,matplotlib支持定义generator生成器函数,用于生成数据,吧生成的数据交给update函数更新图像。
from matplotlib import animation as ma

# 定义更新函数行为
def update(data):
	t, v= data
	...
	pass

def generator():
	yield t, y

# 每隔10秒将会先调用生成器,获取生成器返回的数据,
# 将生成器函数生成的数据交给update更新函数,并且调用update函数,更新图像

anim = ma.FuncAnimation(plt.gcf(), 	update, generator, interval=10	 	)
  • 案例:绘制信号曲线:y = sin(2 * π \pi π * t) * exp(sin(0.2 * π \pi π * t)), 数据通过生成器函数生成,在update函数中绘制曲线。
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation as ma


plt.figure('Signal', facecolor='lightgray')
plt.title('Signal', fontsize=14)
plt.xlim(0, 10)
plt.ylim(-3, 3)
plt.grid(linestyle='--', color='lightgray', alpha=0.5)

# 初始化时x, y坐标为空,后面通过更新函数往里塞值
pl = plt.plot([], [], color='dodgerblue', label='Signal')[0]

x = 0

def update(data):
	t, v = data
	x, y = pl.get_data()
	x = np.append(x, t)
	y = np.append(y, v)
	# 重新设置数据源
	pl.set_data(x, y)
	# 移动坐标轴
	if(x[-1] > 10):
		plt.xlim(x[-1] - 10, x[-1])

def y_generator():
	global x
	y = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x))
	yield (x, y)
	x += 0.05

# 每隔20秒,调用生成器函数获取数据,将数据传递给update函数,并且执行图像更新
anim = ma.FuncAnimation(plt.gcf(), update, y_generator, interval=20)
plt.tight_layout()
plt.show()

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值