matplotlib你真的明白plt,fig和ax吗

你真的明白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,xlablegrid都是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】可以领取速查表:

image-20221127103703719

image-20221127103713773

猜你喜欢

转载自blog.csdn.net/wlh2067/article/details/128081514
今日推荐