Matplotlib
matplotlib是python的绘图库,使用它可以很方便的绘制出版质量级别的图形
matplotlib的基本功能
1.基本绘图
1.1 绘制坐标系中连续的线,设置线型/线宽/颜色
绘制一条线的相关API
import numpy as np
import matplotlib.pyplot as plt
# xarray:散点的x坐标数组
# yarray:散点的y坐标数组
plt.plot(xarray, yarray)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10)
y = np.arange(1,10)
plt.plot(x, y)
plt.show()
绘制水平线和垂直线相关API
# 绘制一条垂直x轴的线,需要给定x坐标值的value,指定y坐标范围
plt.vlines(value, ymin, ymax,..)
# 绘制一条垂直y轴的线,需要给定y坐标值的value,指定x坐标范围
plt.hlines(value, xmin, xmax,..)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10)
y = np.arange(1,10)
plt.plot(x, y)
plt.vlines(5, 3, 8)
plt.hlines(5, 3, 8)
plt.show()
线型/线宽/颜色
plt.plot(x,y,
linestyle='', # 线型
linewidth=1, # 线宽
color='', # 颜色
alpha=0.5 # 透明度
)
- r 红色
- g 绿色
- b 蓝色
- c cyan
- m 紫色
- y 土黄色
- k 黑色
- w 白色
1.2 设置坐标轴的范围
plt.xlim(x_lim_min, x_lim_max)
plt.ylim(y_lim_min, y_lim_max)
1.3 设置坐标刻度
# 设置x轴的坐标刻度
# x_val_list:坐标值列表
# x_text_list:坐标刻度列表
plt.xticks(x_val_list, x_text_list)
plt.yticks(y_val_list, y_text_list)
# 设置坐标刻度[-π,-π/2, 0, π/2, π]
---------------方法一------------
x_val_list= [-np.pi, -np.pi/2, 0, np.pi/2, np.pi]
x_text_list = ['-π','-π/2','0','π/2','π']
plt.xticks(x_val_list, x_text_list)
--------------方法二-------------
x_text_list = [r'$-\pi$',r'$-\frac{\pi}{2}$',r'0',r'$\frac{\pi}{2}$',r'${\pi}$']
刻度文本的特殊语法 - LaTeX排版语法规范
设置坐标轴
坐标轴包含四个:left/right/bottom/top
# getCurrentAxis() 获取当前坐标轴对象
ax = plt.gca()
ax1 = ax.spines['left']
axr = ax.spines['right']
# 设置坐标轴的颜色
axl.set_color('none') # 设置坐标轴颜色为透明
# 设置坐标轴的位置
axl.set_position((type,val))
# 设置坐标轴颜色与位置
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
1.4 显示图例
# 自动在窗口中某个位置添加图例
# 添加图例需要在调用plt.plot()绘制曲线时设置label参数
通过loc参数设置图例的位置
plt.legend(loc='')
# 实例
plt.plot(x, cos_x, linestyle='--', linewidth=3, color='y', label=r'$y =\frac{1}{2}cos(x)$')
plt.plot(x, sin_x, linestyle='-.', linewidth=1, color='m', label=r'$y=sin(x)$')
plt.legend()
1.5 绘制特殊点
plt.scatter(x,y,
marker='', # 点型
s=3, # 点的大小
edgecolor='', # 边缘色
facecolor='', # 填充色
zorder=3) # 绘制顺序
1.6 为图像添加备注
plt.annotate(
'', # 备注内容
xycoords='', # 备注目标点使用的坐标系
xy=(x,y), # 备注目标点的坐标
textcoords= '', # 备注文本使用的坐标系
xytext = (x,y), # 备注文本的坐标
fontsize = 14, # 备注文本字体大小
arrowprops = dict() # 提示箭头属性
)
arrowprops参数使用字典定义只想目标点的箭头样式
arrowprops = dict(
arrowstyle = '', # 定义箭头样式
connectionstyle = '' # 定义连接线样式
)
# 可设置箭头的弧度
connectionstyle='arc3, rad=0.1',
2.高级绘图
2.1 绘制子图
一次绘制两个窗口
plt.figure(
'', # 窗口标题
figsize=(4,3), # 窗口大小
facecolor = '' # 窗口颜色
)
plt.show() # 展示窗口
# 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上
#,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
plt.figure('figure1', figsize=(4,3), facecolor='lightgray')
plt.figure('figure2', figsize=(4,3), facecolor='lightgray')
设置当前窗口的常用参数
plt.title('', fontsize=18) # 设置标题
plt.xlabel('', fontsize=12) # 设置窗口中x坐标轴的文本及y坐标轴的文本
plt.ylabel('', fontsize=12)
plt.tick_params(label=8) #
plt.grid() # 设置图表网格线
plt.tight_layout() # 设置紧凑布局
矩阵式布局
plt.figure('')
# 开始绘制一个子图
# 通过参数rows与cols拆分当前窗口,每个子窗口都将分配一个序号, 1-x
plt.subplot(rows, cols, num)
plt.subplot(2,3,2)
plt.subplot(233)
plt.show()
绘制九宫格子图
import numpy as np
import matplotlib.pyplot as mp
mp.figure('Sub Layout', facecolor='gray')
for i in range(1, 10):
mp.subplot(3, 3, i)
mp.text(0.5, 0.5, i, ha='center',
va='center', size=36, alpha=0.8)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
网格式布局
import matplotlib.gridspec as mg
mp.figure('')
# 该方法将会返回子图的二维数组
gs = mg.GridSpec(3, 3)
# 通过subplot对子图进行合并
# gs[0, :2]->合并0行中的0/1列作为1个子图进行绘制
mp.subplot(gs[0, :2])
mp.show()
自由布局
plt.figure(
'', # 窗口标题
figsize=(4,3), # 窗口大小
facecolor = '' # 窗口颜色
)
plt.show() # 展示窗口
# 可以创建多个窗口,每个窗口的标题不同,后续调用plt的方法进行绘制时将作用于当前窗口上,如果希望修改已经创建过的窗口,可以通过plt.figure('figure1')方法把该窗口设置为当前窗口。
plt.figure('figure1', figsize=(4,3), facecolor='lightgray')
plt.figure('figure2', figsize=(4,3), facecolor='lightgray')
2.2散点图
plt.scatter(x,y,marker='', s=10,color='',edgecolor='',facecolor='',zorder=3)
随机生成一堆点身高期望在1.72 体重在60kg
import numpy as np
import matplotlib.pyplot as plt
n = 100
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')
plt.ylabel('weight')
d = (x-172)**2 + (y-60)**2
# 颜色映射
plt.scatter(x, y, c=d, s=40)
plt.show()
2.6 图像填充
以某种颜色自动填充两条曲线的闭合区域。
plt.fill_between(
x, # x轴水平坐标
sinx, # sinx曲线的y坐标
cosx, # cosx曲线的y坐标
sinx<cosx, # 填充条件为TRUE时,填充
color='', # 颜色
alpha=0.3 # 透明度
)
实例:sinx>cosx的部分进行填充
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8*np.pi,1000)
sinx = np.sin(x)
cosx = np.cos(x/2)/2
plt.figure('Fill', facecolor='lightgray')
plt.title('Fill')
plt.xlabel('X')
plt.ylabel('Y')
plt.tick_params(labelsize=10)
plt.plot(x,sinx,color='y', label='y=sin(x)')
plt.plot(x, cosx,color='b', label='y=cos(x/2)/2')
plt.fill_between(
x, # x轴水平坐标
sinx, # sinx曲线的y坐标
cosx, # cosx曲线的y坐标
sinx>cosx, # 填充条件为TRUE时,填充
color='dodgerblue', # 颜色
alpha=0.5 # 透明度
)
plt.tight_layout()
plt.legend()
plt.show()
2.7 条形图(柱状图)
plt.bar(
x, # 水平坐标数组
y, # 柱状图高度数组
width, # 柱子的宽度
color='', # 填充颜色
label='', # 标签
alpha=0.5
)
案例:绘制苹果12个月的销量,绘制橘子的销量
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
apples = [42, 35, 34, 56, 47, 45, 75, 23, 45, 23, 42, 34]
oranges = [21, 43, 25, 46, 58, 74, 52, 12, 43, 54, 65, 46]
plt.figure('Bar', facecolor='lightgray')
plt.title('Bar', fontsize=18)
plt.xlabel('month', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':', axis='y')
x = np.arange(len(apples))
plt.bar(x - 0.2, apples, 0.4, color='y', label='Apple')
plt.bar(x + 0.2, oranges, 0.4, color='b', label='Orange')
plt.xticks(x, ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月',
'十月', '十一月', '十二月'])
plt.legend()
plt.show()
2.8 饼图
功能:统计出占所有总量的百分比
plt.pie(
values, # 值列表
spaces, # 扇形之间的间距列表
labels, # 扇形的标签列表
colors, # 扇形的颜色列表
'%d%%', # 所占比例的格式
shadow=True, # 绘制阴影
startangle=90, # 逆时针绘制饼状图的起始角度
radius=1 # 半径
)
案例:绘制饼状图显示5门语言的流行度
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.figure('Pie', facecolor='lightgray')
plt.title('Pie', fontsize=18)
values = [23, 24, 46, 57, 87]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'Javascript', 'C++', 'Java', 'PHP']
colors = ['r', 'g', 'b', 'y', 'c']
plt.pie(values, spaces, labels, colors,'%d%%', shadow=False)
plt.legend()
plt.show()
2.9 等高线图
组成等高线需要网格点坐标矩阵,也需要每个点的高度,所以等高线的绘制属于3D数学模型的范畴
mp.contourf(
x, # 网格坐标矩阵
y,
z, # 坐标矩阵中每个点的值
8, # 把整个模型的高度等分为8份
cmap='jet' # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负号的显示问题
n = 1000
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.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.contourf(x,y,z,8,cmap='jet')
cntr = plt.contour(x,y,z,8,colors='black', linewidths=0.5)
# 设置等高线的标签文本
plt.clabel(cntr, inline_spacing=1, fmt='%.1f', fontsize=10)
plt.legend()
plt.show()
2.10 热成像图
用图像的方式显示矩阵集矩阵中值的大小
# origin的可选值:
# 'upper':默认值 y轴方向向下,原点在上方
# 'lower':原点在下方
plt.imshow(z, cmap='jet',origin='lower')
实例:热成像图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴负号的显示问题
n = 1000
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('Hot', facecolor='lightgray')
plt.title('Hot', fontsize=18)
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.imshow(z, cmap='jet', origin='lower')
plt.show()
2.11 3D图像绘制
matplotlib支持绘制三维曲面,但需要使用axis3d提供的3D坐标轴进行绘制。
from mpl_toolkits.mplot3d import axes3d
ax3d = plt.gca(projection='3d')
# 使用ax3d对象绘制3维图形
ax3d.scatter() # 3维散点图
ax3d.plot_surface() # 3维平面图
ax3d.plot_wireframe() # 3维线框图
三维散点图的绘制
ax3d.scatter(
x,y,z, # 点的位置坐标点
marker,
s=30,
zorder=3,
color='',
edgecolor='',
facecolor='',
c=v,
cmap=''
)
案例:生成三维散点数组,显示在三维坐标中。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n = 1000
# 期望是0, 标准差是1
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)
plt.figure('Scatter', facecolor='lightgray')
plt.title('Scatter', fontsize=18)
plt.grid(linestyle=':')
ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)
# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.scatter(x, y, z, c=v, cmap='jet')
plt.show()
三维平面图的绘制
ax3d.plot_surface(
x,y,z, # 点的位置坐标点
rstride = 30, # 行跨距
cstride=30, # 列跨距
cmap='jet' # 颜色映射
)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n = 1000
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('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=18)
plt.grid(linestyle=':')
ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)
# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.plot_surface(x, y, z, rstride=30, cstride=30, cmap='jet')
plt.show()
三维线框图的绘制
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 解决坐标轴负号的显示问题
n = 1000
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('三维平面图', facecolor='lightgray')
plt.title('三维平面图', fontsize=18)
plt.grid(linestyle=':')
ax = plt.gca(projection='3d')
ax.set_xlabel('X', fontsize=12)
ax.set_ylabel('Y', fontsize=12)
ax.set_zlabel('Z', fontsize=12)
plt.tick_params(labelsize=8)
# v的值用于设置散点的颜色
v = np.sqrt(x ** 2 + y ** 2 + z ** 2)
ax.plot_wireframe(x, y, z, rstride=30, cstride=30, cmap='jet')
plt.show()