Matplotlib
绘图基础
- 基本初始化
fig, ax = plt.subplots()
- 绘制曲线
ax.plot(list_of_x, list_of_y, marker='+')
- 绘制散点图
ax.scatter(list_of_x, list_of_y)
绘图方式的区别
- gca, gcf, axes, figure
- https://stackoverflow.com/questions/37970424/what-is-the-difference-between-drawing-plots-using-plot-axes-or-figure-in-matpl
在数据点旁标注数值
ax.annotate('{}'.format(value), xy=(x, y), xytext=(-1, 1), ha='left', textcoords='offset points', color='b')
textcoord
参数也可以为offset pixels
,偏移值单位为像素
text中使用latex公式
- 用
'$\latex$'
给字符串赋值,可以在字符串前加r,r'$\latex$'
表示raw,避免\n
等转义
label
ref: Moving x-axis to the top of a plot in matplotlib 将x axis的label放到顶部 ax.set_xlabel(‘X LABEL’) ax.xaxis.set_label_position(‘top’)
多子图绘制
https://zhuanlan.zhihu.com/p/75276939
subplot
- 例如绘制一个有三张子图的图示,分两行显示,第一行显示两张图片,第二行显示一张图片,并在第三张图上叠加绘制标记
fig = plt.figure(figsize=(12,10))
ax0 = plt.subplot2grid((2,2),(0,0))
ax1 = plt.subplot2grid((2,2),(0,1))
ax2 = plt.subplot2grid((2,2),(1,0),colspan=2)
ax0.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
ax1.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
ax2.imshow(cv2.cvtColor(img3, cv2.COLOR_BGR2RGB))
ax2.plot(spline[0], spline[1], color='c', linewidth=2)
ax2.scatter(100, 100, color='b', linewidth=5)
plt.tight_layout()
plt.show()
subplots
GridSpec
fig与axle
- 一个图中单一子图
fig, ax = plt.subplots(figsize=(12,9))
- 在一个图中放置两个子图(axle),比例由gridspec_kw指定,整个图的大小由figsize指定
fig, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [2, 1]}, figsize=(12,9))
- 绘图
c = ax.pcolormesh(mat)
- 坐标标注
a1_list = a_list[:25] ax1.set_xticks(np.arange(len(a1_list))) ax1.set_xticklabels(a1_list)
- 坐标轴图例
ax1.set_xlabel('acceleration')
- 绘图
图类型
- pcolormesh Vs. pcolor
- 设定上下限以外的特殊颜色
复制已有配色color map,设置特定颜色
my_cmap = copy.copy(cm.get_cmap("rainbow")) my_cmap.set_under('w') my_cmap.set_over('k') c = ax1.pcolormesh(mat,cmap=my_cmap,vmin=1e-6,vmax=1)
- 设置上下限范围内特定值的颜色,现将要高亮的数据设置为nan
for i in range(len(mat)): if mat[i] < 1e-3 and mat[i] > -1e-3: mat[i] = np.nan mat = np.ma.masked_invalid(mat) my_cmap.set_bad(color='w',alpha = 1.)
- 设定上下限以外的特殊颜色
复制已有配色color map,设置特定颜色
动画
- 改变
, , 的数值:Matplotlib没有 set_zdata
,用set_3d_properties
line[h].set_xdata(xline) line[h].set_ydata(yline) line[h].set_3d_properties(z)
写入
写入视频
- 方法一
anim = animation.FuncAnimation(fig, animate, #init_func=init, frames=n_sample*(layers-1), interval=200, blit=False, repeat=False) plt.rcParams['animation.ffmpeg_path'] = 'C:\\ffmpeg\\bin\\ffmpeg.exe' writervideo = animation.FFMpegWriter(fps=10, extra_args=['-vcodec', 'libx264']) anim.save('output.mp4', writer=writervideo)
- 报错的处理
MovieWriter ffmpeg unavailable; using Pillow instead.
安装额外的软件包pip install ffmpeg ffmpeg-python
,在系统中安装ffmpeg,并且配置到环境路径中(Windows) 查看ffmpeg是否配置好:import matplotlib.animation as manimation print(manimation.writers.list())
- 方法二
import matplotlib.animation as manimation
from matplotlib.animation import FuncAnimation
anim = FuncAnimation(fig, animate, init_func = init,
frames = 200, interval = 20, blit = True, repeat=False)
anim.save('spiral.mp4', writer = 'ffmpeg', fps = 30)
写入GIF动画
- 参考
anim.save('hough.gif', dpi=80, writer='imagemagick')
与OpenCV协作
设置样式
修改窗口大小
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)
使布局更紧凑
plt.tight_layout()