图表绘制的 matplotlib 库
matplotlib 是 Python 的 2D&3D 绘图库,可以处理数学运算、绘制图表,或者在图像上
绘制点、直线和曲线。
图像的结构和构成元素
Figure figure 就是整张图像,包含了很多的 axes。(画布)
Axes axes 是一个带有坐标系的绘图区域,这个才是进行绘图的地方。(子图)
Axis axis 就是坐标轴
Artist 几乎所有的在 figure 上看到的东西都属于 artist,如图例,边框,标题
线型、线宽、颜色、坐标轴范围、坐标轴刻度等
例:
import [Link] as plt
import numpy as np
[Link](figsize=(6,4))
x=[Link](0,[Link]*4,0.01)
y=[Link](x)
[Link](x,y,"g-",linewidth=2.0) #g 为 glue 线条为绿色“-”表示线型,“linewidth”为线宽
[Link]("x") #x 轴文字 [Link](“x”,fontsize=12) 设置 x 的字体大小
[Link]("cos(x)") #y 轴文字
[Link](-1,1) #y 轴范围
[Link]("y=cos(x)") #图表标题,默认情况下不支持中文
[Link](True) #加网格
[Link]() #显示画布
在图表中显示中文
matplotlib 的默认配置文件中,使用的字体无法在图表中正确显示中文。
在.py 文件头部加上如下内容,可以让图表能正确显示中文。
[Link]['[Link]-serif']='SimHei' #设置字体为黑体
[Link]['axes.unicode_minus']=False #用来正常显示负值
中文字体说明:
“SimHei” “Kaiti” “LiSu” “YouYuan” “STsong”
黑体 楷体 隶书 幼圆 宋体
创建画布
figure()函数传递一个整数参数作为 figure 对象的序号,该序号用于标识多幅图表中的一个
图表。
(1)figure 语法说明
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定 figure 的宽和高,单位为英寸;
dpi 参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为 80
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
import [Link] as plt from matplotlib import pyplot as plt
fig=[Link](figsize=(4,3),facecolor='blue') fig=[Link]()
[Link]() fig.set_size_inches(5,3)
fig.set_facecolor('gray')
[Link]()
绘制多个子图
1) Subplot
语法 subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
import numpy as np from matplotlib import pyplot as plt
import [Link] as plt [Link]['[Link]-serif']='SimHei'
x = [Link](0, 100) fig=[Link]()
[Link](221) #作图 1 [Link]("subplot 方法示例")
[Link](x, x) ax1=fig.add_subplot(221)
[Link](222) #作图 2 ax1.set_title("2 行 2 列中的第 1 个子图")
[Link](x, -x) ax2=fig.add_subplot(222)
[Link](223) #作图 3 ax2.set_title("2 行 2 列中的第 2 个子图")
[Link](x, x ** 2) ax3=fig.add_subplot(223)
[Link](color='r', linestyle='--',alpha=0.3) ax3.set_title("2 行 2 列中的第 3 个子图")
[Link](224) #作图 4 ax4=fig.add_subplot(224)
[Link](x, [Link](x)) ax4.set_title("2 行 2 列中的第 4 个子图")
[Link]() [Link]()
2) Axes
Axes()函数添加子图时,需要传入一个四元组参数,用于指定子图左下角在画布上距离
左边、底边的距离分别与画布宽度和高度的比例,以及子图的宽度和高度分别占画布宽度
和高度的比例。
from matplotlib import pyplot as plt
[Link]['[Link]-serif']='SimHei'
fig=[Link]()
ax1=fig.add_axes([0.1,0.1,0.8,0.8])
ax2=fig.add_axes([0.5,0.5,0.4,0.2])
ax1.set_title("子图 1")
ax2.set_title("子图 2")
坐标轴
1)设置坐标轴范围
axes.set_xlim(left,right)和 axes.set_ylim(left,right)设置 x 轴和 y 轴的显示范围,如果 left 或
right 为 None,则表示只限制坐标轴一端的值域范围。
import [Link] as plt import [Link] as plt
import numpy as np import numpy as np
[Link](figsize=(6,4)) fig=[Link]()
x=[Link](0,[Link]*4,0.01) axes=fig.add_axes([0.1,0.1,0.8,0.8])
y=[Link](x) x=[Link](0,[Link]*4,0.01)
[Link](x,y) y=[Link](x)
[Link](0,6) [Link](x,y)
[Link](-1.5,1.5) axes.set_xlim(0,6)
[Link]() axes.set_ylim(-1.5,1.5)
[Link]()
2)设置坐标轴标签
在上面的例子中加入语句
[Link]('x') [Link]('cos(x)')
或
axes.set_xlabel('x') axes.set_ylabel("cos(x)")
3)设置坐标轴(移动坐标轴)
坐标轴名 left right bottom top
#获取当前坐标轴字典,{left:左轴,right:右轴,bottom:下轴,top:上轴}
ax = [Link]
#获取其中某个坐标轴
Axis = [Link][‘坐标轴名’]
#设置坐标轴的位置。该方法需要传入 2 个元素的元组作为参数
#type:<str> 移动坐标轴的参照类型 一般为‘data’(以数据的值作为移动参照值)
#val:参照值
axis.set_position((type,val))
#设置坐标轴的颜色
#color:<str> 颜色值字符串
axis.set_color(color)
import [Link] as plt
import numpy as np
[Link](figsize=(6,4))
x=[Link](-[Link]*2,[Link]*2,0.01)
y=[Link](x)
[Link](x,y)
[Link](-6,6)
[Link](-1.5,1.5)
ax = [Link]()
[Link]['top'].set_color('none')
[Link]['right'].set_color('none')
[Link]['left'].set_position(('data',0))
[Link]['bottom'].set_position(('data',0))
[Link]()
刻度
1)简单刻度设置
X 轴和 y 轴刻度设置
[Link]() [Link]() plt.tick_params()
import [Link] as plt
import numpy as np
[Link]['[Link]-serif']='SimHei' #设置字体为黑体
[Link]['axes.unicode_minus']=False #用来正常显示负值
[Link](figsize=(6,4))
x=[Link](-5,5)
y=x**2
[Link](x,y)
x_titcks=[-5,-4,-3,-2,-1,0,1,2,3,4,5]
#x_titcks=[-5,-3,-1,1,3,5] #换下刻度的密度
#x_labels=["%s 秒"%i for i in x_titcks]
[Link](x_titcks) #[Link](x_titcks,x_labels)
[Link]()
import [Link] as plt
import numpy as np
times=['2015/6/26','2015/8/1','2015/9/6','2015/10/12','2015/11/16','2015/12/26',
'2016/1/26','2015/3/26','2015/5/26','2015/7/26','2015/8/26','2015/9/26',
'2015/10/26','2015/11/26']
scales=[Link](500,2000,size=len(times))
[Link](times,scales)
#[Link](rotation=45) #设置逆时针转 45 度
#plt.tick_params(labelsize=6) #设置刻度的字号大小
#[Link](range(1,len(times),2),rotation=45,color=’r’) #减少一半的刻度
[Link]()
import [Link] as plt
import numpy as np
[Link]['[Link]-serif']='SimHei' #设置字体为黑体
[Link]['axes.unicode_minus']=False #用来正常显示负值
[Link](figsize=(6,4))
x=[Link](-5,5)
y=x**2
[Link](x,y)
vals=[-[Link]*2,-[Link],-[Link]/2,0,[Link]/2,[Link],2*[Link]]
x_titcks=['$-\pi*2$','$-\pi$','$-\pi/2$',0,'$\pi/2$','$\pi$','$\pi*2$'] #显示特殊字符
#x_titcks=[r'$-\pi*2$',r'$-\pi$',r'$-\frac{\pi}{2}$',0,r'$\frac{\pi}{2}$',r'$\pi$',r'$\pi*2$'] #显示分数形式
[Link](vals,x_titcks) #上面的写法与 LaTeX 排版公式一致,具体自己上网查看
[Link]()
2)复杂设置
设置主副刻度、设置刻度显示密度
set_major_locator 设置主刻度
set_minor_locator 设置副刻度
set_major_formatter 设置主刻度文本格式化
set_minor_formatter 设置副刻度文本格式化
① locator
ticker 模块中提供了多种 locator 类,部分列表如下
1. AutoLocator, 默认值,自动对刻度线的位置进行设置
2. MaxNLocator, 根据提供的刻度线的最大个数,自动设置
3. IndexLocator, 根据起始位置和间隔来设置刻度线
4. MultipleLocator, 根据指定的间隔来设置刻度线
5. FixedLocator, 根据提供的列表元素来设置刻度线
6. NullLocator,不显示刻度线
②
formatter
和 locator 类相似,formatter 也是有很多的类,部分列表如下
1. PercentFormatter,标签显示成百分比
2. StrMethodFormatter,根据字符串格式化语法进行格式化
3. FormatStrFormatter,根据字符串格式化语法进行格式化
4. MultipleLocator, 根据指定的间隔来设置刻度线
5. NullFormatter,不显示标签
import [Link] as plt
import numpy as np
import [Link] as ticker
x=[Link](0,2*[Link],50)
fig=[Link]()
ax1=fig.add_subplot(231)
[Link](x, [Link](x), label='sin')
ax1 = [Link]()
[Link].set_major_locator([Link](5))
ax2=fig.add_subplot(232)
[Link](x, [Link](x), label='sin')
[Link].set_major_locator([Link](2,0))
ax3=fig.add_subplot(233)
[Link](x, [Link](x), label='sin')
[Link].set_major_locator([Link](1.5))
ax4=fig.add_subplot(234)
[Link](x, [Link](x), label='sin')
[Link].set_major_locator([Link]([0,1, 2,3, 4,5,6]))
ax5=fig.add_subplot(235)
[Link](x, [Link](x), label='sin')
[Link].set_major_locator([Link]())
[Link]()
import [Link]
import numpy as np
from [Link] im
[Link]['[Link]-s
[Link]['[Link]
import [Link] as plt
import numpy as np
import [Link] as ticker
x=[Link](0,4*[Link],50)
fig=[Link]()
ax1=fig.add_subplot(221)
[Link](x, [Link](x), label='sin')
ax1 = [Link]()
[Link].set_major_formatter([Link]())
ax2=fig.add_subplot(222)
[Link](x, [Link](x), label='sin')
ax2 = [Link]()
[Link].set_major_formatter([Link]('{x:.2f}'))
ax3=fig.add_subplot(223)
[Link](x, [Link](x), label='sin')
ax3 = [Link]()
[Link].set_major_formatter([Link]('%.2f'))
ax4=fig.add_subplot(224)
[Link](x, [Link](x), label='sin')
ax4 = [Link]()
[Link].set_major_formatter([Link]())
[Link]()
刻度设置坐标轴日期格式
[Link]
import [Link] as plt
import numpy as np
import [Link] as mdates
x=[Link]('2019-01','2019-06',dtype='datetime64[D]')
y=[Link]([Link][0])
fig=[Link]()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
[Link](x,y,c='g')
[Link].set_major_locator([Link]())
[Link].set_major_formatter([Link]('\n%Y-%m-%d'))
[Link].set_minor_locator([Link](bymonthday=(1,11,21)))
[Link].set_minor_formatter([Link]('%d'))
[Link]()
import [Link] as plt
from [Link] import MultipleLocator, ScalarFormatter
fig= [Link]()
ax1 = fig.add_subplot(221)
[Link]([0, 10, 20, 30], [0, 2, 1, 2])
[Link].set_minor_locator(MultipleLocator(1))
[Link].set_minor_formatter(ScalarFormatter())
ax1.tick_params(axis ='both', which ='major',labelsize = 16, pad = 12,colors ='r')
ax1.tick_params(axis ='both', which ='minor',labelsize = 8, colors ='b')
ax2 = fig.add_subplot(222)
[Link]([0, 10, 20, 30], [0, 2, 1, 2])
[Link].set_minor_locator(MultipleLocator(1))
[Link].set_minor_formatter(ScalarFormatter())
ax3 = fig.add_subplot(223)
[Link]([0, 10, 20, 30], [0, 2, 1, 2])
[Link](axis='both',color='r',linewidth=1.5)
ax4 = fig.add_subplot(224)
[Link]([0, 10, 20, 30], [0, 2, 1, 2])
[Link].set_minor_locator(MultipleLocator(1))
[Link].set_minor_formatter(ScalarFormatter())
ax4.tick_params(axis ='both', which ='major',labelsize = 16, pad = 12,colors ='r')
ax4.tick_params(axis ='both', which ='minor',labelsize = 8, colors ='b')
[Link](which='major',axis='both',color='r',linewidth=1.5)
[Link](which='minor',axis='x',color='b',linestyle='--',linewidth=0.5,alpha=0.5)
[Link]()
图例
import [Link] as plt
import numpy as np 0- best
[Link](figsize=(6,4)) 1- upper right
x=[Link](0,[Link]*4,0.01) 2- upper left
y=[Link](x) 3- lower lefr
z=[Link](x) 4- lower right
[Link](x,y,label="cos(x)") #红色部分被设置为图例 5- right
[Link](x,z,label="sin(x)") 6- center left
[Link]() 7- center right
#[Link](loc=8) #图例在图中的位置,值为 0-10,loc 不写则放在最佳位置 8- lower center
[Link]() 9- upper center
10- center
文本标注
[Link](x,y,string,fontsize=10,verticalalignment=”top”,horizontalalignment=”right”)
x,y 坐标位置 string 文本
Verticalalignment 垂直对齐方式 参数[“center”,”top”,”bottom”,”baseline”]
Horizontalalignment 水平对齐方式 参数[“center”,”right”,”left”]
import [Link] as plt
import numpy as np
[Link](figsize=(6,4))
x=[Link](0,[Link]*4,0.01)
y=[Link](x)
z=[Link](x)
[Link](x,y)
[Link](x,z)
[Link](5,1,"cos(x)")
[Link](6,-0.5,"sin(x)")
[Link]()
标题 title
网格 grid
grid(b, which, axis, color, linestyle, linewidth, **kwargs)
b:是否显示网格
which : 取值为'major', 'minor', 'both',指主刻度,副刻度,两者都是
axis : 取值为‘both’, ‘x’,‘y’。
import [Link] as plt
import numpy as np
[Link](figsize=(6,4))
[Link](color="r",linestyle="--")
[Link]()
显示和保存 show() 和 savefig()
文本注解工具 annotate
import numpy as np
import [Link] as plt
fig, ax = [Link]()
# 绘制一个余弦曲线
t = [Link](0.0, 5.0, 0.01)
s = [Link](2*[Link]*t)
line, = [Link](t, s, lw=2)
# 绘制一个黑色,两端缩进的箭头
[Link]('local max', xy=(2, 1), xytext=(3, 1.5),
xycoords='data',
arrowprops=dict(facecolor='black', shrink=0.05)
)
ax.set_ylim(-2, 2)
[Link]()
详细介绍见:
[Link]
[Link]
[Link] 极客教程/matplot 教程
画图命令
pyplot 模块提供了 [Link]()、[Link]()、[Link]()、[Link]()、[Link]()等 14 个用于绘
制“基础图表”的常用函数。
水平线和垂直线
[Link](vval,ymin,ymax)
[Link](xval,xmin,xmax)
plt([10,20,30,40],1,6)
plt([10,20,30,40],[1,2,3,4],[2,3,4,5])
曲线图
plot(x,y,[fmt],**kwargs)
fmt 格式字符串 用来快速设置颜色、线型等属性
具体属性 help([Link])查看
线型可以在 fmt 中设置,如"g-"中的“-”表示实线,也可以在**kwargs 中设置
如:[Link](x,y,"g",linestyle=’- -’)
import [Link] as plt
import numpy as np
[Link](figsize=(6,4))
x=[Link](0,[Link]*4,0.01)
y=[Link](x)
[Link](x,y,"g-",linewidth=2.0) #g 为 glue 线条为绿色“-”表示线型,“linewidth”为线宽
[Link]() #显示画布
**kwargs:(一部分)
alpha: 透明度 0-1,0 表示透明,1 表示不透明
label: object 字符串类型,用于设置在图例中显示的曲线名称
linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...} 浮点数类型 用于设置线型
linewidth or lw: float 浮点数类型 用于设置线宽
color: 用于设置线的颜色
marker: marker style string, `~.[Link]` or `~.[Link]` 用于设置点的类型
markeredgecolor or mec: color 用于设置点的边缘颜色
markeredgewidth or mew: float 用于设置点的边框粗细
markerfacecolor or mfc: color 用于设置点的颜色
markersize or ms: float 用于设置点的大小
同样的函数还有 semilogx(),semology(),loglog()等
散点图
scatter(x,y,s=None,c=None,cmap=None,alpha=None,**kwarge)
s:标量或数组,表示离散点的大小
cmap:用于指定映射调色板
alpha:[0,1]之间的浮点数,表示离散点的透明度
import numpy as np
import [Link] as plt
x = [Link](1,10)
y=x
fig = [Link]()
ax1 = fig.add_subplot(111)
ax1.set_title('Scatter Plot')
sValue = x*10
[Link](x,y,s=sValue,c='r',marker='x')
[Link]()
import [Link] as plt
import numpy as np
x=[Link](50)
y=[Link](50)
color=10*[Link](50)
area=[Link](30*[Link](50))
fig=[Link]()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
[Link](x,y,c=color,s=area,cmap="hsv",marker="o",edgecolor="r",alpha=0.5)
[Link]()
关于 cmap 的参数详见:
[Link]
图层
import numpy as np
import [Link] as plt
fig=[Link]()
X = [Link](1, 100, 10, endpoint=True)
Y = [Link](60, 100, len(X))
ax1=fig.add_subplot(121)
[Link](X, Y, color ='blue', linewidth=3.5)
[Link](X, Y, 50, color ='red')
ax2=fig.add_subplot(122)
[Link](X, Y, color ='blue', linewidth=3.5, zorder=1) # 在第一层画线
[Link](X, Y, 50, color ='red', zorder=2) # 在第二层画点,数字越大,显示越靠上
[Link]()
等值线图
contour([x,y],z,[levels],**kwargs)
contourf([x,y],z,[levels],**kwargs)
Z 是二维数组,x 和 y 是与 z 形状相同的二维数组;或 x 和 y 都是一维的,且 x 的长度等于 z
的列数,y 的长度等于 z 的行数
import [Link] as plt
import numpy as np
def f(x,y):
# the height function
return (1 - x / 2 + x**5 + y**3) * [Link](-x**2 -y**2)#公式
n = 256
x = [Link](-3, 3, n)
y = [Link](-3, 3, n)
X,Y = [Link](x, y) #网格的输入值
[Link](X,Y,f(X,Y),8,alpha=0.75,cmap=[Link])
#contour 是等高线,f 是 filling 将颜色填充进去。8 是等高线的圈数,alpha 是透明度,cmap 是温度显示
C = [Link](X,Y,f(X,Y),8,color='black',linewidth=.5) #等高线的线的样式
[Link](C,inline=True,fontsize=10) #添加等高线的刻度,inline 在线里面
[Link](()) #让 x 和 y 显示出来刻度
[Link](())
[Link]()
矢量合成图
quiver(U,V,**kw)
quiver(U,V,c,**kw)
quiver(X,Y,U,V,**kw)
quiver(X,Y,U,V,c,**kw)
U、V:一维或二维数组,U 表示矢量的水平分量,V 表示矢量的垂直分量
X、Y:一维或二维数组,表示矢量箭头的位置,没有则根据 U 和 V 的维数生成一个统
一的整数网格
C:一维或二维数组,由映射调色板映射箭头颜色,不支持显示颜色
import [Link] as plt
import numpy as np
y,x=[Link][-3:3:12j,-5:5:20j]
p=[Link](x,y)
fig=[Link]()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
[Link](x,y,x,y,p,cmap="hsv")
[Link]()
直方图
hist()
hist(x, bins=None, range=None, normed=False, weights=None, cumulative=False,
bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log=False,
color=None, label=None, stacked=False, hold=None, data=None, **kwargs)
直方图是对数字数据分布的精确表示。它是对一个连续变量的概率分布的一种估计。
它是一种条形图。要构建一个直方图,请遵循以下步骤
将数值的范围 划分 出来。
将整个数值范围划分为一系列的区间。
计算每个区间内有多少数值。
分区通常被指定为一个变量的连续、不重叠的区间。
from matplotlib import pyplot as plt
import numpy as np
fig,ax = [Link](1,1)
a = [Link]([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
[Link](a, bins = [0,25,50,75,100])
ax.set_title("histogram of result")
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('no. of students')
[Link]()
柱状图
bar(x,height, width,*,align=‘center’,**kwargs)
x 包含所有柱子的下标的列表
height 包含所有柱子的高度值的列表
width 每个柱子的宽度。可以指定一个固定值,那么所有的柱子都是一样的宽。或者设置一
个列表,这样可以分别对每个柱子设定不同的宽度。
align 柱子对齐方式,有两个可选值:center 和 edge。center 表示每根柱子是根据下标来对
齐, edge 则表示每根柱子全部以下标为起点,然后显示到下标的右边。如果不指定该参数 ,
默认值是 center。
import [Link] as plt
import numpy as np
# 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80 像素/每英寸
[Link](figsize=(8, 6), dpi=80)
[Link](1, 1, 1)
N = 6 # 柱子总数
values = (25, 32, 34, 20, 41, 50) # 包含每个柱子对应值的序列
index = [Link](N) # 包含每个柱子下标的序列
width = 0.35 # 柱子的宽度
# 绘制柱状图, 每根柱子的颜色为紫罗兰色
p2 = [Link](index, values, width, label="rainfall", color="#87CEFA")
[Link]('Months') # 设置横轴标签
[Link]('rainfall (mm)') # 设置纵轴标签
[Link]('Monthly average rainfall') # 添加标题
[Link](index, ('Jan', 'Fub', 'Mar', 'Apr', 'May', 'Jun')) # 添加纵横轴的刻度
[Link]([Link](0, 81, 10))
[Link](loc="upper right") # 添加图例
[Link]()
饼图
pie(x,explode=None,Labels=None,color=None,autopct=None,shadow=False,labeldistance=1.1,
Startangle=None,center=(0,0))
import [Link] as plt
import numpy as np
[Link]['[Link]-serif']='SimHei'
x=[Link]([10,10,5,70,2,10])
labels=["娱乐","育儿","饮食","房贷","交通","其他"]
explode=(0,0,0,0.1,0,0)
fig=[Link]()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
[Link](x,explode=explode,labels=labels,autopct="%1.1f%%",startangle=150)
[Link]()
3D 图像绘制
Matplotlib 支持三维曲面,需要使用 axes3d 提供的 3d 坐标系。
from mpl_toolkits.maplot3d import axes3d
ax3d = [Link](projection=’3d’)
[Link](...) #绘制三维点阵
ax3d.plot_surface(....) #绘制三维曲面
ax3d.plot_wireframe(...) #绘制三维线框图
动画
在一段时间内快速连续的重新绘制图像的过程
在 Matplotlib 库中有一个子库 animation,该库下定义了多种用于绘制动态效果图的类,
例如 FuncAnimation,ArtistAnimation 等,我们这里主要介绍 FuncAnimation 的使用。该类通
过重复调用某个功能函数从而实现动态绘图效果,在功能函数中会对图进行一些修改,只
要调用时间间隔足够短,给人的感觉就是图在动态变化。创建 FuncAnimation 对象时,需要
传递的主要参数及其含义如下:
fig:用于显示动态效果的画布,即 Figure 对象;
func:函数名,重复调用的功能函数;
frames:每一帧数据,通常是可迭代对象,依次取出每一个数据传递给功能函数;
init_func:初始函数,用于执行初始化操作;
fargs:传递给功能函数的额外参数;
save_count:保存计数,默认为 100;
interval:重复调用功能函数的间隔时间,单位为毫秒,默认为 200;
repeat_delay:动画结束后,重复执行动画的间隔时间,单位为毫秒;
repeat:动画执行结束后,是否重复,默认为 True;
blit:是否更新所有点,即更新所有点还是仅更新变化的点,默认为 False;
cache_frame_data:是否缓存数据,默认为 True;
注意事项:
使 用 FuncAnimation 前 , 需 先 导 入 该 类 , 代 码 为 : from [Link] import
FuncAnimation;
创建 FuncAnimation 对象后一定要将其赋值给某个变量,否则系统会将其进行垃圾回收。
import [Link] as ma
#定义更新函数行为
def update(number):
pass
#每隔 10 毫秒执行一次 update 更新函数,作用于 [Link]()当前窗口对象
#[Link]():获取当前窗口 #update:更新函数#interval:间隔时间(单位:毫秒)
anim=[Link]([Link](),update,interval=10)
[Link]()
import numpy as np
import [Link] as plt
from [Link] import FuncAnimation
fig = [Link](figsize=(10, 5)) # 创建图
[Link]["[Link]"] = "FangSong" # 支持中文显示
[Link](-12, 12) # Y 轴取值范围
[Link]([-12 + 2 * i for i in range(13)], [-12 + 2 * i for i in range(13)]) # Y 轴刻度
[Link](0, 2 * [Link]) # X 轴取值范围
[Link]([0.5 * i for i in range(14)], [0.5 * i for i in range(14)]) # X 轴刻度
[Link]("函数 y = 10 * sin(x) 在[0,2Π]区间的曲线") # 标题
[Link]("X 轴") # X 轴标签
[Link]("Y 轴") # Y 轴标签
x, y = [], [] # 用于保存绘图数据,最开始时什么都没有,默认为空
def update(n): # 更新函数
[Link](n) # 添加 X 轴坐标
[Link](10 * [Link](n)) # 添加 Y 轴坐标
[Link](x, y, "r--") # 绘制折线图
ani = FuncAnimation(fig, update, frames=[Link](0, 2 * [Link], 0.1), interval=50, blit=False,
repeat=False) # 创建动画效果
[Link]() # 显示图片
import numpy as np
import [Link] as plt
from [Link] import FuncAnimation
fig, ax = [Link]() # 创建画布和绘图区
ax.set_axis_off() # 不显示坐标轴
x = [Link](0, 2 * [Link], 0.01) # 生成 X 轴坐标序列
line1, = [Link](x, [Link](x)) # 获取折线图对象,逗号不可少,如果没有逗号,得到的是元组
line2, = [Link](x, [Link](x)) # 获取折线图对象,逗号不可少
def update(n): # 动态更新函数
line1.set_ydata([Link](x + n / 10.0)) # 改变线条 y 的坐标值
line2.set_ydata([Link](x + n / 10.0)) # 改变线条 y 的坐标值
ani = FuncAnimation(fig, update, frames=100, interval=50, blit=False, repeat=False) # 创建动画
效果
[Link]() # 显示图
import numpy as np
import [Link] as plt
from [Link] import FuncAnimation
[Link]("Signal",facecolor='lightgray')
[Link]("Signal",fontsize=14)
[Link](0,10)
[Link](-3,3)
[Link](linestyle='--',color='lightgray',alpha=0.5)
pl = [Link]([],[],color='dodgerblue',label='Signal')[0]
pl.set_data([],[])
x=0
def update(data):
t,v = data
x,y = pl.get_data()
[Link](t)
[Link](v)
pl.set_data(x,y)
if(x[-1]>10):
[Link](x[-1]-10,x[-1])
def y_generator(): #数据通过生成器函数生成
global x
y = [Link](2*[Link]*x)*[Link]([Link](0.2*[Link]*x))
yield(x,y)
x+=0.05
ani = FuncAnimation([Link](), update,y_generator,interval=20)
plt.tight_layout()
[Link]() # 显示图
实例:随机生成各种颜色的 100 个气泡,让他们不断的增大
#-*- coding:utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import [Link] as plt
import [Link] as ma
ball_type = [Link]([
('position',float,2),#位置(水平和垂直坐标)
('size',float,1), #大小
('growth',float,1), #生长速度
('color',float,4)]) #颜色(红、绿、蓝和透明)
#随机生成 100 个点对象
n = 100
balls = [Link](100,dtype=ball_type)
balls['position'] = [Link](0,1,(n,2))
balls['size'] = [Link](40,70,n)
balls['growth'] = [Link](10,20,n)
balls['color'] = [Link](0,1,(n,4))
[Link]("Animation",facecolor='lightgray')
[Link]("Animation",fontsize=14)
[Link]([])
[Link]([])
sc = [Link](
balls['position'][:,0],
balls['position'][:,1],
s=balls['size'],
color = balls['color'],alpha=0.5)
def update(number):
balls['size']+=balls['growth'] #点的大小增大
sc.set_sizes(balls['size']) #重新绘制
anim = [Link]([Link](),update,interval=30) #每隔 30 毫秒重新调用 update 函数
[Link]()
词云图
[Link]