matplotlib简介
Matplotlib 是一个 Python 的 2D绘图库(包括3D图表),它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 名称由来:mat (matrix 矩阵(二维数据 - 二维图表))plot(画图)lib(library库)
一. matplotlib图像
1. 组成部分:
- Axis: 坐标轴
- Tick: 刻度线
- Label: 标签
- Title: 图表标题
- Data: 函数
2. 绘图步骤:
1) 创建简单图像
1) 导入module
import matplotlib.pyplot as plt import numpy as np2) 定义变量的单位及函数y1, y2
# 创建np对象, x = np.linspace(-1, 1,50) # linspace 是生成50个点 y1 = 2*x +1 y2 = x ** 23) 绘制及显示
plt.figure() plt.plot(x, y2) plt.plot(x, y1) plt.show()
2) 设置figure图像
# 创建画布 给figure自定义名字, 大小 plt.figure(num=3 , figsize=(8,5)) plt.plot(x, y2) # 给线设置颜色 线宽 线型 --表示虚线 plt.plot(x, y1, color = 'red', linewidth = 10, linestyle = '--') plt.show()
3) 设置坐标轴
# 给x轴设置范围 plt.xlim((-1, 2)) # y轴设置范围 plt.ylim((-2,3)) # x轴,y轴设置标签 plt.xlabel('I am x') plt.ylabel('I am y') # 设置坐标轴的标尺 new_ticks = np.linspace(-1, 3, 5) print(new_ticks) # 将新修改的x轴数据范围及步长, 赋值给x轴 # ticks就是坐标值步长的小标 plt.xticks(new_ticks)
4) 移动坐标轴
# 移动坐标轴的位置 # gca = 'get current axis' 把现在的轴拿出来 # ax是指当前的这个图像 ax = plt.gca() #spines 指 figure图像画布的四个边框 # 把有边框 上边框的颜色设置为透明色, 我们要用左轴\下轴来移动设置为x轴,y轴 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # 下轴设置为x轴, 将左轴设置为y轴 ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') #选中bottom轴设置它的位置, 并将原点放在y轴的0位置 ax.spines['bottom'].set_position(('data',0)) # 定位outward, axes: 相对于y轴的百分比 ax.spines['left'].set_position(('data',0))
5) 设置标题
# 设置title ax.set_title('two_lines')
二. 基础函数
1. plot函数
plt.plot(x, y, format_string, **kwargs)x: X轴数据, 列表 或数组, 可选
y: Y轴数据, 列表 或驻足
format_string: 控制曲线的格式字符串, 可选
**kwarg : 第二组 或更多(x, y, format_string), 可画多条曲线. 注意: 当绘制多条曲线时各曲线的x不能省略
2. format_string参数
① 颜色字符
颜色字符 | 说明 | 颜色字符 | 说明 |
'b' | 蓝色 | 'm' | 洋红色 |
'g' | 绿色 | 'y' | 黄色 |
'r' | 红色 | 'k' | 黑色 |
'c' | 青绿色 | 'w' | 白色 |
'#9999ff' | RGB颜色 | '0.5' | 灰度值字符串 |
②标记字符
标记字符 | 说明 | 标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|---|---|
' . ' | 点 | ' 1 ' | 下花三角 | ' h ' | 竖六边形 |
' , ' | 像素标记(极小点) | ' 2 ' | 上花三角 | ' H ' | 横六边形 |
' o ' | 实心圆 | ' 3 ' | 左花三角 | ' + ' | 十字 |
' v ' | 倒三角 | ' 4 ' | 右花三角 | ' x ' | x标记 |
' ^ ' | 上三角 | ' s ' | 实心方形 | ' D ' | 菱形 |
' > ' | 右三角 | ' p ' | 实心五角 | ' d ' | 瘦菱形 |
' < ' | 左三角 | ' * ' | 星形标记 | ' | ' | 垂直线 |
③风格字符
风格字符 | 说明 |
---|---|
' - ' | 实线 |
' -- ' | 破折线 |
' -. ' | 点折线 |
' : ' | 虚线 |
' ' ' ' | 无线条 |
3. 设置标题/ 轴标签/ 刻度及刻度标签
函数 | 说明 |
---|---|
set_title(内容) | 设置图像的标题 |
plt.set_xticks(ticks = None, labels = None) | 设置X轴数据刻度 以及标签 |
set_xticklabels() | 设置X轴刻度的标签 |
set_xlabel() | X轴的名称 |
4. text()函数
plt.text(x, y, s, fontdict= None, **kwargs)x ,y: 放置文本的位置, 默认情况下, 这是在数据坐标中. 可以使用变换参数来更改坐标系.
s: str, 文本
fontdict: 用于覆盖 默认文本属性的字典, 如果fontdict为None, 则默认值由rcParams确定.
import numpy as np
import matplotlib.pyplot as plt
t = np.arange( 0.0, 2.0, 0.01)
s = np.sin( 2*np.pi*t)
plt.plot(t, s)
plt.title( r'$\alpha_i > \beta_i$', fontsize= 20)
plt.text( 1, - 0.6, r'$\sum_{i=0}^\infty x_i$', fontsize= 20)
plt.text( 0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',fontsize= 20)
plt.xlabel( 'time (s)')
plt.ylabel( 'volts (mV)')
plt.show()
5. 在有中文输出的处增加一个属性:fontproperties
1) 相关属性
属性 | 说明 |
---|---|
font.family | 用于显示字体的名字 |
font.style | 字体风格, 正常是'normal' 或'italic' |
font.size | 字体大小, 整数字号或者'large', 'x-small' |
2) 常用字体类型
中文字体 | 说明 |
---|---|
'SimHei' | 中文黑体 |
'Kaiti' | 中文楷体 |
'LiSu' | 中文隶书 |
'FangSong' | 中文仿宋 |
'YouYuan' | 中文幼圆 |
'STSong' | 华文宋体 |
# 导包
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
6. 图例Legend
ax.legend([line1, line2, line3], labels=['label1', 'label2', 'label3'],loc='lower right', fontsize=12, frameon=True, title=None,edgecolor = 'white',facecolor = 'blue')Labels[列表] :图例标签
loc : 图例的位置(best / upper right / upper left / lower left / lower right/ right / center / center left / lower center)
fontsize : 字体大小
frameon : 是否显示图例的边框, False(去掉边框)
title : 图例的标签
edgecolor: 设置图例的边框颜色
facecolor : 设置图例的背景颜色, 若无边框, 参数无效
三.实例
1. 同一窗口生成多张图
plt.subplot(nrows, ncols, plot_number)# 行 列 定位到一个子绘图区域编号
1) 均衡分区
① 示例一:
import matplotlib.pyplot as plt
plt.figure()
# 把figure划分为两行两列
# 在第一个小ax中画一个图
plt.subplot(2, 2, 1)
plt.plot([0,1],[0,1])
# 在第二个ax中也画一个图
plt.subplot(2, 2, 2)
plt.plot([0,1], [0, 2]) #
plt.subplot(2, 2, 3)
plt.plot([0,1], [0, 3])
plt.subplot(2, 2, 4)
plt.plot([0, 1], [0,4])
plt.show()
② 示例二:
# subplot 画图二
# 创建一个画布
plt.figure()
plt.subplot(2, 1, 1)
plt.plot([0,1],[0,1])
plt.subplot(2, 3, 4)
plt.plot([0,1],[0,2])
plt.subplot(2, 3, 5)
plt.plot([0,1], [0,3])
plt.subplot(2, 3, 6)
plt.plot([0,1], [0,4])
plt.show()
2) 不均衡分区
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure()
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3, rowspan=1)
ax1.plot([1, 2], [1, 2])
ax1.set_title('ax1_title')
ax2 = plt.subplot2grid((3,3),(1,0), colspan= 2,)
ax3 = plt.subplot2grid((3,3),(1,2), rowspan= 2,)
ax4 = plt.subplot2grid((3,3),(2,0))
ax5 = plt.subplot2grid((3,3),(2,1))
2. 散点图
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None,edgecolors=None, hold=None, data=None, **kwargs)x , y :输入数据, array_like , shape (n,)
s :点的大小 , 标量或 array_like , shape (n,),可选大小以点数 ^ 2 。
c :点的颜色
marker :点的形状 cmap : cmap 仅在 c 是浮点数组时使用。如果没有,默认为rcimage.cmap 。 norm :实例用于缩放亮度数据为 0,1 。 norm 只有在 c 是一个数组时才被使用 彩车。alpha :标量, 可选,默认值:无
alpha : 混合值,介于 0 (透明)和 1 (不透明)之间, linewidths :标量或 array_like ,可选,默认值:无 如果无,则默认为 (lines.linewidth ,)。 verts :(x, y )的序列,可选 如果 marker 为 None ,这些顶点将用于构建标记。标记的中心位于 在(0,0 )为标准化单位。整体标记重新调整 由 s 完成。
edgecolors :颜色或颜色顺序。
import matplotlib.pyplot as plt
import numpy as np
n = 1024 #
X = np.random.normal(0,1,n) # 生成随机值, 平均数是0, 标准差是1, 个数是1024个
Y = np.random.normal(0,1,n)
T = np.arctan2(X,Y) # 给值设置颜色
# 打印散点图
plt.scatter(X, Y, s=57, c = T, alpha=0.5)
#设置x,y轴值的范围
plt.xlim((-1.5, 1.5))
plt.ylim((-1.5, 1.5))
# 将x.y轴的标签隐藏掉
plt.xticks(())
plt.yticks(())
plt.show()
3. 柱状图
plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)left : X轴
right : Y轴, 柱形图的高度
alpha : 颜色的透明度
width : 宽度
color : 填充的颜色
edgecolor : 边缘的颜色
Label : 解释每个图像代表的含义
linewidth(lw) : 边缘 或线的宽度
import numpy as np
import matplotlib.pyplot as plt
# 设置柱状的个数
n = 12
X = np.arange(n)
# 生成对应的Y坐标值
Y1= (1 - X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1- X/float(n)) * np.random.uniform(0.5, 1.0, n)
# 给柱状设置颜色 和 柱子边框的颜色
plt.bar(X, +Y1, facecolor = '#9999ff',edgecolor = 'white')
plt.bar(X, -Y2, facecolor = '#ff9999',edgecolor = 'white')
# 给每个柱状图添加数据标签
for x,y in zip(X, Y1): # zip(): 使用序列解包对多个变量同时进行赋值
# 设置数据标签位置, ha :横向对齐方式, va: 纵向对齐方式
plt.text(x +0.4, y+0.05, '%.2f'%y, ha='center', va='bottom')
for x,y in zip(X, Y2):
plt.text(x +0.4,-y-0.5, '%.2f'%y, ha='center', va='top')
plt.xlim(-5,n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())
plt.show()
4. 堆叠柱形图
import matplotlib.pyplot as plt
import numpy as np
data_X = [
'l1',
'l2',
'l3',
'l4',
'l5']
data_Y = [
0.96332673,
0.41957767,
0.28530194,
0.66399872,
0.39162668]
data_Y1 = [
0.95827706,
0.570968,
0.1820442,
0.6373498,
0.3974183]
data_Y2 = [
0.52999985,
0.54202189,
0.6418166,
0.69023167,
0.90743048]
x = np.arange(
len(data_X))
# 设定步长
p1 = plt.bar(x, data_Y )
p2 = plt.bar(x, data_Y1, bottom=data_Y)
#bottom 为数据条距坐标轴的距离
p3 = plt.bar(x, data_Y2, bottom=[data_Y1[i]+data_Y[i]
for i in range(
min(
len(data_Y1),
len(data_Y)))])
plt.xticks(x, data_X)
plt.show()
5. 直方图
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid’, orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None)x :指定要绘制直方图的数据;输入值,这需要一个数组或者一个序列,不需要长度相同的数组。
bins :指定直方图条形的个数;
range :指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
density :布尔 , 可选。如果 "True" ,返回元组的第一个元素将会将计数标准化以形成一个概率密度, 也就是说,直方图下的面积(或积分)总和为1 。这是通过将计数除以数字的数量来实现的观察乘以箱子的宽度而不是除以总数数量的观察。如果叠加也是“真实”的,那么柱状图被规范化为1。 ( 替代normed)
weights :该参数可为每一个数据点设置权重;
cumulative :是否需要计算累计频数或频率;
bottom :可以为直方图的每个条形添加基准线,默认为 0 ;
histtype :指定直方图的类型,默认为 bar ,除此还有’ barstacked’, ‘step’, ‘stepfilled’ ;
align :设置条形边界值的对其方式,默认为 mid ,除此还有’ left’ 和’ right’ ;
orientation :设置直方图的摆放方向,默认为垂直方向;
rwidth :设置直方图条形宽度的百分比;
log :是否需要对绘图数据进行 log 变换;
color :设置直方图的填充色;
# 1、准备数据
time = [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、创建画布
plt.figure(figsize=(20, 8), dpi=80)
# 3、绘制直方图
distance = 2
group_num = int((max(time) - min(time)) / distance) # 取整
plt.hist(time, bins=group_num, density=True)
# 修改x轴刻度
plt.xticks(range(min(time), max(time) + 2, distance))
# 添加网格
plt.grid(linestyle="--", alpha=0.5)
# 4、显示图像
plt.show()
6. 饼图
pit.pie(x, labels= , autopct= , colors)x:数量,自动算百分比
labels:每部分名称
autopct占比显示指定%1.2f%%
%1.2f%%:显示百分数,%-浮点数,1.2f-占一个位置,保留一位小数,%-转义字符,%-百分号输出
colors:每部分颜色
import matplotlib.pyplot as plt
#定义饼的标签,
labels = ['one','two','three','four','five','other']
#每个标签所占的数量
x = [200,500,1200,7000,200,900]
#饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.1)
#设置阴影效果
#plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode,shadow=True)
plt.pie(x,labels=labels,autopct='%3.2f%%',explode=explode, labeldistance=1.35, pctdistance=1.2)
plt.legend()
plt.show()
7. Image图片
import matplotlib.pyplot as plt
import numpy as np
#
fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
im = ax.imshow(np.random.random((10, 10)), vmin=0, vmax=1)
plt.colorbar(im, ax=axes.ravel().tolist())
plt.show()
8. 绘制3D图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
# X , Y 的值
X = np.arange(-4,4, 0.25)
Y = np.arange(-4,4, 0.25)
X,Y = np.meshgrid(X,Y)
R = np.sqrt(X ** 2+ Y ** 2)
# height 的值
Z = np.sin(R)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap= plt.get_cmap('rainbow'))
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap = 'rainbow')
ax.set_zlim(-2, 2)
plt.show()
9. matplotlib的基础图标函数汇总表:
函数 | 说明 |
---|---|
plt.plot(x, y,...) | 绘制一个坐标图 |
plt.boxplot(data, notch, position) | 绘制一个箱型图 |
plt.bar(left, height, width, bottom) | 绘制一个条形图 |
plt.barh(width, bottom, left, height) | 绘制一个横向条形图 |
plt.polar(theta, r) | 绘制极坐标图 |
plt.pie(data, explode) | 绘制饼图 |
plt.psd(x, NFFT=256, pad_to, F) | 绘制功率谱密度图 |
plt.specgram(x, NFFT=256, pad_to, F) | 绘制谱图 |
plt.cohere(x, NFFT=256, Fs) | 绘制X-Y的相关性函数 |
plt.scatter(x,y) | 绘制散点图, 其中,x和y的长度相同 |
plt.step(x,y,where) | 绘制步阶图 |
plt.hist(x, bins,normed) | 绘制直方图 |