因为课题需要,所以我Matlab和Python是常常混着用的,使用过程中就会发现Matlab和Python的绘图逻辑差别还是挺大的:
✦ Matlab绘制Figure的逻辑是实时交互,运行一行代码就更新图上的内容,不堵塞后续代码执行,这样就方便在终端输入代码就能不断补充完善Figure,所以用Matlab绘图更倾向在命令行直接改图,之后再汇总代码;
✦ 而Python绘图默认是先缓存,最后再输出,并且一旦输出显示Figure窗口后,就默认堵塞后续代码执行,并清除前面的缓存,要改图就必须重新完整跑一次绘图代码,更倾向在py脚本或者ipynb文件里不断调整代码一次次重新运行来改图。
比如Matlab终端输入这样的代码,就能立马绘制出了Figure
x = 0:0.1:2*pi;y = sin(x);plot(x, y, 'r-', 'LineWidth', 2);
然后我想要再加标签,就再输入下面代码,就能在原图的基础上进行补充
xlabel('x');ylabel('sin(x)');title('正弦波');
而Python绘图逻辑是倾向于先缓存再最终输出的
终端输入
import matplotlib.pyplot as pltimport numpy as npx = np.arange(0, 2*np.pi, 0.1)y = np.sin(x)plt.plot(x, y, 'r-', linewidth=2)必须添加plt.show()才能绘图展示,否则不显示

而一旦plt.show()显示出图后,就会自动清空缓冲区,导致没法在终端在原来的基础上继续画图
plt.xlabel("x")plt.ylabel("sin(x)")plt.title("正弦波")plt.show()
并且plt.show()默认画图窗口会阻塞程序运行,必须关闭绘图窗口才能继续运行。这两个问题就非常影响修改图的流畅体验。
虽然也能用plt.show(block=False)或plt.ion()来实现后台绘图和不清空缓存区,但是这样依然比Matlab麻烦很多,所以日常用Python每次改图,都习惯把绘图代码再完整跑一次。
import matplotlib.pyplot as pltimport numpy as npx = np.arange(0, 2*np.pi, 0.1)y = np.sin(x)plt.plot(x, y, 'r-', linewidth=2)plt.xlabel("x")plt.ylabel("sin(x)")plt.title("正弦波")plt.show()
标题无法显示中文
需要额外设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签Matlab的Figure窗口可以直接编辑图上的任何元素,调整宽高比例、改颜色、改字体和文字大小、添加箭头注释等等,就不需要去记一些绘图代码,鼠标点点就能完成绘图的美化,并且可以基于窗口修改的内容再生成代码。此外,除了能把Figure保存为常规的png、pdf等图片格式外,还能保存为.fig文件,之后如果需要修改图,直接双击.fig文件即可再用Figure窗口打开这个图,再进行编辑,不需要再重新跑一次代码来生图

而Python的matplotlib的绘图窗口就简陋的多,只能简单查看图和保存图

打开变量内容,选中一行或者一列,点击顶部的绘图类型

就能直接出图

✦ Matlab 统一Figure大小的正确姿势:统一有legend和无legend的图大小