(一)基础知识
1.基础用法(figure,plot,show)
- plt.figure:定义一个figure图像窗口,可以有很多小图片
- plt.plot:绘制曲线
- plt.show:显示图像
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x + 1
y2 = x**2
plt.figure(num=3,figsize=(8,5))
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.show()

2.调整轴的刻度范围和名称(xlim,xlabel,xticks)
- plt.xlim:设置x轴范围
- plt.xlabel:设置x轴名称
- plt.xticks:设置x轴刻度及名称
plt.xlim((-1,2))
plt.ylim((-2,3))
plt.xlabel('x')
plt.ylabel('y')
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],[r'$really\ bad$',r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
plt.show()

3.调整坐标轴至原点
(1)设置边框颜色白色
- plt.gca:获取坐标轴信息
- ax.spines:选择边框
- set_color:设置颜色
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
(2)调整坐标轴位置(0,0)中心
- ax.xaxis.set_ticks_position:设置x轴刻度数字/名称的位置
- set_position:设置边框位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.show()

4.显示数据对应的图像名称
将上文中plot代码更改为
plt.plot(x,y2,label='square line')
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='linear line')
添加如下代码
plt.legend(loc='upper right')
下图中的右上角显示了每个图的名称

如果想修改label,除了在plot中修改以外,可以先将图像用变量存储起来
l2, = plt.plot(x,y2,label='square line')
l1, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='linear line')
plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')

loc参数表示图像名称的显示位置,best表示自动分配最佳位置
'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,
5.添加标注(箭头和文本)
- plt.annotate:指向型注释,标注不仅包含注释的文本内容还包含箭头指向
- plt.text:文本型注释
首先绘制一条直线
x = np.linspace(-3,3,50)
y = 2*x + 1
plt.figure(num=1,figsize=(8,5))
plt.plot(x,y)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
标注点(1,3)的位置信息,绘制一条垂直于x轴的虚线,绘制一个点
x0 = 1
y0 = 3
plt.plot([x0,x0],[0,y0],'k--',linewidth=2.5)
plt.scatter([x0,],[y0,],s=50,color='b')
添加箭头标注
plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',
fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle="arc3,rad=.2"))
添加注释文本
plt.text(-3.7,3,r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
fontdict={'size':16,'color':'r'})

(二)画图
散点图scatter
n = 1024
x = np.random.normal(0,1,n)
y = np.random.normal(0,1,n)
t = np.arctan2(y,x)
plt.scatter(x,y,s=75,c=t,alpha=0.5)
plt.xlim(-1.5,1.5)
plt.xticks(())
plt.ylim(-1.5,1.5)
plt.yticks(())
plt.show()

柱状图
向上向下分别生成12个数据,X为 0 到 11 的整数 ,Y是相应的均匀分布的随机数据
n = 12
X = np.arange(n)
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')
plt.xlim(-.5, n)
plt.ylim(-1.25, 1.25)
添加文本,ha是横向居中对齐,va纵向底部(顶部)对齐
for x, y in zip(X, Y1):
plt.text(x + 0.1, y + 0.05, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x + 0.1, -y - 0.05, '%.2f' % y, ha='center', va='top')

等高线图
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)
def f(x,y):
return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 - y**2)
plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)
c = plt.contour(X,Y,f(X,Y),8,color = 'black',linewidth = 0.5)
plt.clabel(c, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())

2D图
绘制2D图像
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
0.365348418405, 0.439599930621, 0.525083754405,
0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
interpolation内插法,以下为matplotlib官网上对于内插法的不同方法的描述,此处选择Nearest-neighbor 的方法

添加注释条
plt.colorbar(shrink=0.92)
plt.xticks(())
plt.yticks(())
plt.show()

3D图
额外导入Axes3D显示3D坐标
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
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)
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=-1.3, cmap=plt.get_cmap('rainbow'))

(三) 多图subplot
多图均匀分布
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(2,2,1)
plt.plot([0,1],[1,0])
plt.subplot(2,2,2)
plt.bar([0,1,2],[2,3,1])
plt.subplot(223)
plt.plot(list(np.arange(5)))
plt.subplot(224)
plt.bar(list(np.arange(3)),[1,2,3])
plt.show()

多图不均匀分布
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(2,1,1)
plt.plot([0,1],[1,0])
plt.subplot(2,3,4)
plt.bar([0,1,2],[2,3,1])
plt.subplot(235)
plt.plot(list(np.arange(5)))
plt.subplot(236)
plt.bar(list(np.arange(3)),[1,2,3])
plt.show()

图中图
一个大图离有两个小图

大图绘制
fig = plt.figure()
x = [1, 2, 3, 4, 5, 6, 7]
y = [1, 3, 4, 2, 5, 8, 6]
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('big')
小图绘制,更改坐标系位置和大小即可,plt也可以绘制
ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25])
ax2.plot(x,y,'b')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('small 1')
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1],x,'g')
plt.xlabel('x')
plt.ylabel('y')
plt.title('small 2')
两个y轴
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 * y1
fig,ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(x,y1,'g-')
ax1.set_xlabel('x data')
ax1.set_ylabel('y1 data',color='g')
ax2.plot(x,y2,'m')
ax2.set_ylabel('y2 data',color='m')
plt.show()

(四) 动画animation
具体参考matplotlib animation api
绘制0~2π内的正弦曲线的动态图像
import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np
fig,ax = plt.subplots()
x = np.arange(0,2*np.pi,0.01)
def animate(i):
line.set_ydata(np.sin(x + i/10.0))
return line,
def init():
line.set_ydata(np.sin(x))
调用FuncAnimation函数生成动画,参数如下
- fig :进行动画绘制的figure
- func :自定义动画函数,即传入刚定义的函数animate
- frames :动画长度,一次循环包含的帧数
- init_func :自定义开始帧,即传入刚定义的函数init
- interval: 更新频率,以ms计
- blit: 选择更新所有点,还是仅更新产生变化的点。应选择True,mac用户选择False,否则无法显示动画
ani = animation.FuncAnimation(fig=fig,
func=animate,
frames=100,
init_func=init,
interval=20,
blit=False)
plt.show()
实为动图

(五)交互图ion
神经网络训练时需要动态看到loss的变化
参考:https://blog.csdn.net/weixin_42990464/article/details/112347386
- plt.ion():开启交互模式
- plt.ioff():关闭交互模式
- plt.clf():清除当前figure
- plt.cla():清除当前axes
- plt.pause():暂停
注意show之前先用ioff关闭交互模式
import matplotlib.pyplot as plt
x = list(range(1, 21))
loss = [2 / (i**2) for i in x]
plt.ion()
def plot(ix,iy):
plt.cla()
plt.title("loss")
plt.plot(ix, iy)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.pause(0.5)
for i in range(1, len(x)):
ix = x[:i]
iy = loss[:i]
plot(ix,iy)
plt.ioff()
plt.show()
