【matplotlib】正确认识matplotlib布局来画图

原文

原文地址 刚开始使用时一样迷惑,感谢原博主解惑,特此记录(注意看评论区)
官方文档

整体布局图

先来看看官方给的布局图
Parts of a Figure

名词解释

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图像上的表现。

图像各部位名词

Parts of a Figure

正确的画图方式

# 首先创建一块画布
# 这个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'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值