【matplotlib】正确认识matplotlib布局来画图
原文
原文地址 刚开始使用时一样迷惑,感谢原博主解惑,特此记录(注意看评论区)
官方文档
整体布局图
先来看看官方给的布局图
名词解释
Figure fig = plt.figure()
即画布。画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。
Axes ax = fig.add_subplot(1,1,1)
首先,这个不是画图的xy坐标轴。可以把axes理解为画布上的绘图区域,跟坐标轴axis没有直接关联
如果figure只有一张图,那么就只有一个axes。如果你的figure有subplot,那么每一个subplot就是一个axes。axes下可以修改编辑的变量非常多,基本能包含你的所有需求。
Axis ax.xaxis/ax.yaxis
实际坐标轴。每个坐标轴实际上也是由竖线和数字组成的,每一个竖线其实也是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。
图像各部位名词
正确的画图方式
复制# 首先创建一块画布
# 这个function创建了一个大小为(14,7)的画布,把这个画布赋值给变量fig
# 同时在这个画布上创建了一个axes,把这个axes赋值给ax
# 这样,所有fig.xxx都是对这个画布的操作,所有ax.xxx都是对这个axes的操作
fig, ax = plt.subplots(figsize=(14,7))
# 在画布上画图
# 注意,这里依然不使用plt!因为要在这个axes上画数据,因此就用ax.plot()来画
# 画完第一个再call一次,再画第二个
ax.plot(A,B)
ax.plot(B,A)
细节处理
# 首先把标题和xy坐标轴的标题搞定。不用plt,直接在axes上进行设定
ax.set_title('Title',fontsize=18)
ax.set_xlabel('xlabel', fontsize=18,fontfamily = 'sans-serif',fontstyle='italic')
ax.set_ylabel('ylabel', fontsize='x-large',fontstyle='oblique')
ax.legend()
# 然后是xy坐标轴的一些属性设定, 也是在axes level上完成的
ax.set_aspect('equal')
ax.minorticks_on()
ax.set_xlim(0,16)
ax.grid(which='minor', axis='both')
# 最后是坐标轴tick和细节,这个在axes.xaxis or axes.yaxis上完成
ax.xaxis.set_tick_params(rotation=45,labelsize=18,colors='g')
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()
补充(原文评论区内容)
首先 matplotlib 架构上分为三层
底层:backend layer
中层:artist layer
最高层:scripting layer
在任意一层操作都能够实现画图的目的,而且画出来还都一样。但越底层的操作越细节话,越高层越易于人机交互。
.plt 对应的就是最高层 scripting layer。这就是为什么它简单上手,但要调细节就不灵了。
ax.plot 是在 artist layer 上操作。基本上可以实现任何细节的调试。
backend layer, 至今,我还没有见有人在这个layer上操作过。
另外,对于axes (翻译就是 坐标系),我看到有个评论写了很多,说的没有错,但也没说到点子上。
如果大家学过大学物理的话,会知道每一个物体都有一个独立的坐标系。
而matplotlib 就是引用这一理念。所以在artist layer上画多条曲线时,你会用 ax1.plot, ax2.plot ... 而最后显示在一张图上是因为所有独立坐标系对齐的结果。
补充2
# 正确显示中文
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
# 修改轴刻度间隔和格式
ax.yaxis.set_major_locator(plt.MultipleLocator(1))
ax.yaxis.set_major_formatter(plt.FormatStrFormatter("%d"))
# 保存图像
fig.save(path)
# 使用如下语句可查看Matplotlib支持的图形格式
print(fig.canvas.get_supported_filetypes())
{'ps': 'Postscript',
'eps': 'Encapsulated Postscript',
'pdf': 'Portable Document Format',
'pgf': 'PGF code for LaTeX',
'png': 'Portable Network Graphics',
'raw': 'Raw RGBA bitmap',
'rgba': 'Raw RGBA bitmap',
'svg': 'Scalable Vector Graphics',
'svgz': 'Scalable Vector Graphics',
'jpg': 'Joint Photographic Experts Group',
'jpeg': 'Joint Photographic Experts Group',
'tif': 'Tagged Image File Format',
'tiff': 'Tagged Image File Format'}
作者:盛夏光年ltk
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
博主是利用学习、参考、实践、复制和粘贴等多种方式打造成自己的文章,如有帮助记得点赞!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!