你真的明白plt,fig和ax吗?
plt系列接口是用来模仿MATLAB的风格的。如果用户熟悉MATLAB,还是建议以plt为主的。对于基本的画图,plt系列足够了。
个人觉得,真正不合适的用法,反而是各种混淆plt接口和其它更细节的内部接口函数,混杂着用,成了四不像。
学习matplotlib的过程和其它包应该有所区别:如果每次打开CSDN一顿搜索,是很难掌握matplotlib的,因为matplotlib一个相同的功能实现方式很多:
plt.title()
和ax.title.set_text('title')
和ax.set_title()
居然是相同的,如下图:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('_mpl-gallery')
# make data
np.random.seed(1)
x = np.linspace(0, 8, 16)
y1 = 3 + 4*x/8 + np.random.uniform(0.0, 0.5, len(x))
y2 = 1 + 2*x/8 + np.random.uniform(0.0, 0.5, len(x))
# plot
fig, ax = plt.subplots(1, 3, figsize=(12, 4))
for i in range(3):
ax[i].fill_between(x, y1, y2, alpha=.5, linewidth=0)
ax[i].plot(x, (y1 + y2)/2, linewidth=2)
ax[i].set(xlim=(0, 8), xticks=np.arange(1, 8),
ylim=(0, 8), yticks=np.arange(1, 8))
plt.title('plt.title')
ax[0].set_title('ax.set_title')
ax[1].title.set_text('ax.title.set_text')
plt.show()
这就表明如果每次都要手动搜索的话,会非常不确定,因为一种效果有完全不同的实现方式,这次搜到这个,下次搜到那个:
笔者在初学的时候,碰见在figure, axes, axis这几个词就头大
plt vs ax
尝试区分.plt和ax.plot,为什么matplotlib能用不同方式来实现同一功能?
在底层逻辑上,matplotlib架构上分为两层:底层和高层。高层是底层的封装,现在可以加一个最高层seaborn,cartopy等等…
在任意一层操作都能够实现画图的目的,而且画出来是一样的。但越底层的操作越细节,越高层越易于人机交互。
(如最高层searborn,几行代码就行了。最底层ax,反复调节各种轴)
.plt 对应的就是最高层,这就是为什么它简单上手,但要调细节就不方便了。
ax.plot是底层,基本上可以实现任何细节的调试。
看matplotlib官方提供的图绘说明:
- Figure是“画布”,画图的第一件事,就是创建一个画布figure,加各种元素
- axes是“坐标系”,这个命名不太准确,不仅是坐标轴的复数,它应该是物理中“坐标系”的概念,或工程制图中“图纸”的概念,它保证了你在图中画多个物体,这多个物体能在同一个坐标系中。axes包含大部分图像元素,比如坐标轴,标签,注释文字,刻度线等等
- Axis是“坐标轴”,每个坐标轴上包括下列元素:
right plot way
正确的画图方式是fig, ax = plt.subplots()
,虽然大多数教程以plt.xxx
开始,这虽然好上手,但是不便于对代码的理解
#手搓数据
import matplotlib.pyplot as plt
import numpy as np
# make data: correlated + noise
np.random.seed(1)
x = np.random.randn(5000)
y = 1.2 * x + np.random.randn(5000) / 3
ax与plt大部分是通用的,因为我们用了“正统”的画图方式,为了避免混淆,全用ax
# plot:
fig, ax = plt.subplots()
ax.hexbin(x, y, gridsize=20)
plt.show()
用ax调节细节:
xlim
,xlable
与grid
都是ax这一层的
fig, ax = plt.subplots(figsize=(3, 3))
ax.hexbin(x, y, gridsize=20, cmap='BuPu')
ax.set(xlim=(-2, 2), ylim=(-3, 3))
ax.set_xlabel('thisisx', fontsize=12, fontfamily='sans-serif',fontstyle='italic')
ax.set_ylabel('thisisy', fontsize='x-large',fontstyle='oblique')
ax.grid(color='lightgrey', linestyle='--', linewidth=1)
plt.show()
最后是坐标轴tick和细节,这个在axes.xaxis
或者axes.yaxis
上完成。
fig, ax = plt.subplots(figsize=(3, 3))
ax.hexbin(x, y, gridsize=20, cmap='BuPu')
ax.set(xlim=(-2, 2), ylim=(-3, 3))
ax.set_xlabel('thisisx', fontsize=12, fontfamily='sans-serif',fontstyle='italic')
ax.set_ylabel('thisisy', fontsize='x-large',fontstyle='oblique')
ax.grid(color='lightgrey', linestyle='--', linewidth=1)
ax.xaxis.set_tick_params(rotation=45,labelsize=12,colors='saddlebrown')
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end,1))
ax.yaxis.tick_right()
plt.show()
这样就完成对matplotlib的所有操作了
后台回复【matplotlib】可以领取速查表: