matplotlib使用之快速入门

matplotlib概述

matplotlib是python的一个绘图库。使用它可以很方便的绘制出版质量级别的图形。

matplotlib基本功能

一.基本绘图

1.绘制线条

import numpy as np
import matplotlib.pyplot as plt

xs = np.arange(6)
ys = np.array([23, 62, 36, 42, 9, 12])
plt.plot(xs, ys)  # xs:水平坐标序列, ys:水平坐标序列

# 绘制水平线与垂直线
plt.vlines([3, 5, 7, 8], 20, 50)
plt.hlines(30, 1, 4)

plt.show()  # 显示图表

在这里插入图片描述

2.设置坐标轴的范围

#x_limt_min:	<float> x轴范围最小值
#x_limit_max:	<float> x轴范围最大值
plt.xlim(x_limt_min, x_limit_max)
#y_limt_min:	<float> y轴范围最小值
#y_limit_max:	<float> y轴范围最大值
plt.ylim(y_limt_min, y_limit_max)

3.设置坐标轴刻度

#x_val_list: 	x轴刻度值序列
#x_text_list:	x轴刻度标签文本序列 [可选]
plt.xticks(x_val_list , x_text_list )
#y_val_list: 	y轴刻度值序列
#y_text_list:	y轴刻度标签文本序列 [可选]
plt.yticks(y_val_list , y_text_list )

4.设置坐标轴

# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = plt.gca()
# 获取其中某个坐标轴
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
# type: <str> 移动坐标轴的参照类型  一般为'data' (以数据的值作为移动参照值)
# val:  参照值
axis.set_position(('data', val))
# 设置坐标轴的颜色
# color: <str> 颜色值字符串
axis.set_color(color)

5.绘制特殊点

# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray, 
           marker='', 		#点型 ~ matplotlib.markers
           s=50, 			#大小
           edgecolor='', 	#边缘色
           facecolor='',	#填充色
           zorder=3			#绘制图层编号 (编号越大,图层越靠上)
           label=' '		#标签,显示在图例上
)

6.添加备注

# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
mp.annotate(
    r'$\frac{\pi}{2}$',			#备注中显示的文本内容
    xycoords='data',			#备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(x, y),	 				#备注目标点的坐标
    textcoords='offset points',	#备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(x, y),				#备注文本的坐标
    fontsize=14,				#备注文本的字体大小
    arrowprops=dict()			#使用字典定义文本指向目标点的箭头样式
)
# arrowprops参数使用字典定义指向目标点的箭头样式
# arrowprops字典参数的常用key
arrowprops=dict(
	arrowstyle='',		#定义箭头样式
    connectionstyle=''	#定义连接线的样式
)
# 箭头样式(arrowstyle)字符串如下
============   =============================================
Name           Attrs
============   =============================================
  '-'          None
  '->'         head_length=0.4,head_width=0.2
  '-['         widthB=1.0,lengthB=0.2,angleB=None
  '|-|'        widthA=1.0,widthB=1.0
  '-|>'        head_length=0.4,head_width=0.2
  '<-'         head_length=0.4,head_width=0.2
  '<->'        head_length=0.4,head_width=0.2
  '<|-'        head_length=0.4,head_width=0.2
  '<|-|>'      head_length=0.4,head_width=0.2
  'fancy'      head_length=0.4,head_width=0.4,tail_width=0.4
  'simple'     head_length=0.5,head_width=0.5,tail_width=0.2
  'wedge'      tail_width=0.3,shrink_factor=0.5
============   =============================================
# 连接线样式(connectionstyle)字符串如下
============   =============================================
Name           Attrs
============   =============================================
  'angle' 		angleA=90,angleB=0,rad=0.0
  'angle3' 		angleA=90,angleB=0`   
  'arc'			angleA=0,angleB=0,armA=None,armB=None,rad=0.0
  'arc3' 		rad=0.0
  'bar' 		armA=0.0,armB=0.0,fraction=0.3,angle=None
============   =============================================

7.线型、线宽和颜色

#linestyle: 线型   "-"  "--"  ":"  ".-"
#linewidth: 线宽
	#	数字
#color: <关键字参数> 颜色
	#	英文颜色单词 或 常见颜色英文单词首字母 或 #495434 或 (1,1,1) 或 (1,1,1,1)
#alpha: <关键字参数> 透明度
	#	浮点数值
plt.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5, label= '')

8.图例

# 再绘制曲线时定义曲线的label
# label: <关键字参数 str> 支持LaTex排版语法字符串
plt.plot(xarray, yarray ... label='', ...)
# 设置图例的位置
# loc: <关键字参数> 制定图例的显示位置 (若不设置loc,则显示默认位置)
#	 ===============   =============
#    Location String   Location Code
#    ===============   =============
#    'best'            0
#    'upper right'     1
#    'upper left'      2
#    'lower left'      3
#    'lower right'     4
#    'right'           5
#    'center left'     6
#    'center right'    7
#    'lower center'    8
#    'upper center'    9
#    'center'          10
#    ===============   =============
plt.legend(loc='')

案例一

import numpy as np
import matplotlib.pyplot as plt

# 绘制一条正弦曲线
x = np.linspace(-np.pi, np.pi, 1000)
print(x.shape)
# 矢量化的sin方法将会返回每个x对应的y
sinx = np.sin(x)
# 绘制一条余弦曲线   cos(x)/2
cosx = np.cos(x) / 2

# 设置坐标轴的范围   第一象限
# plt.xlim(0, np.pi + 0.1)  # x轴范围为 [0, np.pi + 0.1]
# plt.ylim(0, 1.1)  # y轴范围为 [0, 1.1]

# 修改坐标轴刻度
plt.xticks(
    [-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi],  # x轴刻度值序列
    [r'$-\pi$', r'$-\frac{\pi}{2}$', '0',
     r'$\frac{\pi}{2}$', r'$\pi$'])  # x轴刻度标签文
plt.yticks([-1.0, -0.5, 0, 0.5, 1])  # plt.yticks(y_val_list , y_text_list )

# 设置坐标轴
ax = plt.gca()  # 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax.spines['top'].set_color('none')  # 获取上轴并设置颜色为none
ax.spines['right'].set_color('none')
# 设置坐标轴的位置 set_position(type, val)
# 参数type:移动坐标轴的参照类型 一般为'data'(以数据的值为移动参考值)
# 参数val:参照值
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))

# 绘制特殊点
px = [3 / 4 * np.pi, 3 / 4 * np.pi]
py = [np.sin(px[0]), np.cos(px[1]) / 2]
plt.scatter(px, py, marker='o', color='red',
           s=70, label='Points', zorder=3)


# 添加备注
plt.annotate(
    r'$[\frac{3\pi}{4}, \frac{cos(\frac{3\pi}{4})}{2}]$',
    xycoords='data',
    xy=(3 / 4 * np.pi, np.cos(px[1]) / 2),
    textcoords='offset points',
    xytext=(-80, -30),
    fontsize=14,
    arrowprops=dict(
        arrowstyle='-|>',
        connectionstyle='angle3'
    )
)

plt.plot(x, sinx, linestyle='--', alpha=0.8,
        linewidth=2, color='dodgerblue',
        label=r'$y=sin(x)$')
plt.plot(x, cosx, linestyle='-.', alpha=0.8,
        linewidth=2, color='orangered',
        label=r'$y=\frac{1}{2}cos(x)$')


plt.legend()
plt.show()

在这里插入图片描述

二.图形对象(图形窗口)

# 手动构建 matplotlib 窗口
plt.figure(
    'A',				#窗口标题栏文本 
	facecolor=''		#图表背景色
)
plt.figure('B')
plt.figure('A')  # 把A创建置为当前窗口
plt.plot(....) # 将会作用在A窗口中
plt.show()
# plt.figure方法不仅可以构建一个新窗口,如果已经构建过
# title='xxx'的窗口,又使用figure方法构建了title='xxx' 
# 的窗口的话,plt将不会创建新的窗口,而是把title='xxx'的窗口置为当前操作窗口。
# plt.figure方法不仅可以构建一个新窗口,如果已经构建过title='xxx'的窗口,又使用figure方法构建了title='xxx' 的窗口的话,plt将不会创建新的窗口,而是把title='xxx'的窗口置为当前操作窗口。

1.设置当前窗口参数

# 设置图表标题 显示在图表上方
plt.title(title, fontsize=12)
# 设置水平轴的文本
plt.xlabel(x_label_str, fontsize=12)
# 设置垂直轴的文本
plt.ylabel(y_label_str, fontsize=12)
# 设置刻度参数   labelsize设置刻度字体大小
plt.tick_params(labelsize=8)
# 设置图表网格线  linestyle设置网格线的样式
#	-  or solid 粗线
#   -- or dashed 虚线
#   -. or dashdot 点虚线
#   :  or dotted 点线
plt.grid(linestyle='')
# 设置紧凑布局,把图表相关参数都显示在窗口中
plt.tight_layout() 

2.子图

(1)矩阵式布局
plt.figure('Subplot Layout', facecolor='lightgray')
# 拆分矩阵
	# rows:	行数
    # cols:	列数
    # num:	编号
plt.subplot(rows, cols, num)
	#	1 2 3
	#	4 5 6
	#	7 8 9 
plt.subplot(3, 3, 5)		#操作3*3的矩阵中编号为5的子图
plt.plot()
plt.subplot(3, 3, 1)		#操作3*3的矩阵中编号为1的子图
plt.plot()
plt.subplot(335)			#简写
案例二
import matplotlib.pyplot as plt

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

for i in range(1, 10):
    plt.subplot(3, 3, i)
    plt.text(0.5, 0.5, i, size=36, ha='center', va='center')
    # plt.text(x, y, string, weight="bold", color="b")
    # x: 注释文本内容所在位置的横坐标
    # y:注释文本内容所在位置的纵坐标
    # string:注释文本内容
    # weight:注释文本内容的粗细风格
    # color:注释文本内容的字体颜色
    # ha:水平方向,va:垂直方向
    plt.xticks([])
    plt.yticks([])
    plt.tight_layout()

plt.show()

在这里插入图片描述

(2)网格式布局
# 网格式布局支持单元格的合并
import matplotlib.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.show()
(3)自由式布局
plt.figure('Flow Layout', facecolor='lightgray')
# 设置图标的位置,给出左下角点坐标与宽高即可
# left_bottom_x: 坐下角点x坐标
# left_bottom_x: 坐下角点y坐标
# width:		 宽度
# height:		 高度
# plt.axes([left_bottom_x, left_bottom_y, width, height])
plt.axes([0.03, 0.03, 0.94, 0.94])
plt.text(0.5, 0.5, '1', ha='center', va='center', size=36)
plt.show()

3.刻度定位器

# 获取当前坐标轴
ax = plt.gca()
# 设置水平坐标轴的主刻度定位器
ax.xaxis.set_major_locator(plt.NullLocator())
# 设置水平坐标轴的次刻度定位器为多点定位器,间隔0.1
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))

# 常用刻度器如下
# 空定位器:不绘制刻度
mp.NullLocator()
# 最大值定位器:
# 最多绘制nbins+1个刻度
mp.MaxNLocator(nbins=3)
# 定点定位器:根据locs参数中的位置绘制刻度
mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])
# 自动定位器:由系统自动选择刻度的绘制位置
mp.AutoLocator()
# 索引定位器:由offset确定起始刻度,由base确定相邻刻度的间隔
mp.IndexLocator(offset=0.5, base=1.5)
# 多点定位器:从0开始,按照参数指定的间隔(缺省1)绘制刻度
mp.MultipleLocator()
# 线性定位器:等分numticks-1份,绘制numticks个刻度
mp.LinearLocator(numticks=21)
# 对数定位器:以base为底,绘制刻度
mp.LogLocator(base=2)

4.刻度网格线

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

5.半对数坐标

# y轴将以指数方式递增。 基于半对数坐标绘制第二个子图,表示曲线:[1, 10, 100, 1000, 100, 10, 1]。
plt.figure('Grid', facecolor='lightgray')
y = [1, 10, 100, 1000, 100, 10, 1]
plt.semilogy(y)
plt.show()

6.散点图

plt.scatter(
    x, 					# x轴坐标数组
    y,					# y轴坐标数组
    marker='', 			# 点型
    s=10,				# 大小
    color='',			# 颜色
    edgecolor='', 		# 边缘颜色
    facecolor='',		# 填充色
    zorder=''			# 图层序号
)
# cmap颜色映射, 参见cmap颜色映射表
d = (x - 173)**2 + (y - 65)**2
mp.scatter(x, y, marker='o', s=70,
           label='Persons', c=d, cmap='jet_r')

7.填充

# 以某种颜色自动填充两条曲线的闭合区域
plt.fill_between(
	x,				# x轴的水平坐标
    sin_x,			# 下边界曲线上点的垂直坐标
    cos_x,			# 上边界曲线上点的垂直坐标
    sin_x<cos_x, 	# 填充条件,为True时填充
    color='', 		# 填充颜色
    alpha=0.2		# 透明度
)

8.条形图(柱状图)

plt.figure('Bar', facecolor='lightgray')
plt.bar(
	x,				# 水平坐标数组
    y,				# 柱状图高度数组
    width,			# 柱子的宽度
    color='', 		# 填充颜色
    label='',		#
    alpha=0.2		#
)

9.饼图

# 绘制饼状图的基本API:
plt.pie(
    values, 		# 值列表		
    spaces, 		# 扇形之间的间距列表
    labels, 		# 标签列表
    colors, 		# 颜色列表
    '%d%%',			# 标签所占比例格式
	shadow=True, 	# 是否显示阴影
    startangle=90	# 逆时针绘制饼状图时的起始角度
    radius=1		# 半径
)

10.等高线图

# 组成等高线需要网格点坐标矩阵,也需要每个点的高度。
# 所以等高线属于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='%.1f',
          fontsize=10)
plt.contourf(x, y, z, 8, cmap='jet')

11.热成像图

# 把矩阵z图形化,使用cmap表示矩阵中每个元素值的大小
# origin: 坐标轴方向
#    upper: 缺省值,原点在左上角
#    lower: 原点在左下角
# 绘制热成像图的相关API:
plt.imshow(z, cmap='jet', origin='lower')
# 使用颜色条显示热度值:
plt.colorbar()

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轴坐标数组
    z,              # z轴坐标数组
    marker='', 		# 点型
    s=10,			# 大小
    zorder='',		# 图层序号
    color='',		# 颜色
    edgecolor='', 	# 边缘颜色
    facecolor='',	# 填充色
    c=v,			# 颜色值 根据cmap映射应用相应颜色
    cmap=''			# 
)
3d平面图的绘制相关API
ax3d.plot_surface(
    x, 					# 网格坐标矩阵的x坐标 (2维数组)
    y, 					# 网格坐标矩阵的y坐标 (2维数组)
    z, 					# 网格坐标矩阵的z坐标 (2维数组)
    rstride=30,			# 行跨距
    cstride=30, 		# 列跨距
    cmap='jet'			# 颜色映射
)
3d线框图的绘制
# 绘制3D线框图 
# rstride: 行跨距
# cstride: 列跨距 
ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30, 
	linewidth=1, color='dodgerblue')

13.极坐标系

# 与笛卡尔坐标系不同,某些情况下极坐标系适合显示与角度
# 有关的图像。例如雷达等。极坐标系可以描述极径&rho;与
# 极角&theta;的线性关系
plt.figure("Polar", facecolor='lightgray')
plt.gca(projection='polar')
plt.title('Porlar', fontsize=20)
plt.xlabel(r'$\theta$', fontsize=14)
plt.ylabel(r'$\rho$', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':')
plt.show()

14.简单动画

# 动画即是在一段时间内快速连续的重新绘制图像的过程。
# matplotlib提供了方法用于处理简单动画的绘制。
# 定义update函数用于即时更新图像。
import matplotlib.animation as ma
#定义更新函数行为
def update(number):
    pass
# 每隔10毫秒执行一次update更新函数,作用于plt.gcf()当前窗口对象
# plt.gcf():	获取当前窗口
# update:	更新函数
# interval:	间隔时间(单位:毫秒)
anim = ma.FuncAnimation(plt.gcf(), update, interval=10)
mp.show()

使用生成器函数提供数据,实现动画绘制
在很多情况下,绘制动画的参数是动态获取的,matplotlib支持定义generator生成器函数,用于生成数据,把生成的数据交给update函数更新图像:

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

def generator():
	yield t, v
        
# 每隔10毫秒将会先调用生成器,获取生成器返回的数据,
# 把生成器返回的数据交给并且调用update函数,执行更新图像函数
anim = ma.FuncAnimation(mp.gcf(), update, generator,interval=10)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值