Matplotlib是一个可视化python包,可以用很简单的代码展示2D绘图,如:直方图、折线图、条形图、散点图等。
其画图的基本组件包括:画板(figure),轴域(axes),子图(subplot),轴(axis),数据(x,y坐标)。
关于轴域和子图的相关性和区别,可以参考文末链接python matplotlib中axes与axis的区别是什么?。
1 安装pip install matplotlib
import matplotlib matplotlib.__version__ # 3.3.22 2D图用法 2.1 基础用法
以最简单的直线图为例,有两种方法。其一是通过pyplot包下的plot()方法直接绘制:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2,2,50)
y = 2 * x + 0.1
plt.plot(x, y, color='lightblue', linewidth=5)
plt.xlim(-2,3)
plt.ylim(-2,5)
plt.title("A demo of plot")
plt.show()
其二,是通过创建画布和axes,用对象调用的方式实现:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(-2,2,50) y = 2 * x + 0.1 # 画布 fig = plt.figure() # 增加子图 ax = fig.add_subplot(111) # 设置轴范围,不是必须的步骤 ax.set(xlim=[0,1], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis') # subplot生成的对象调用plot方法绘图 ax.plot(x,y, color='lightblue', linewidth=5) # 类似于ax.set的方式,此处会覆盖上面的设置 ax.set_xlim(-2, 3) ax.set_ylim(-2, 5) plt.show()
比较二者的实现方式,第一种会更简单,更加适合不需要子图的场景;第二种更容易理解,将figure和axes等概念一步步创建,且适合多子图的场景。
2.2 子图的创建fig = plt.figure() # 画板 ax1 = fig.add_subplot(221) # 2*2划分画板,第1块子图 ax2 = fig.add_subplot(222) # 2*2划分画板,第2块子图 ax3 = fig.add_subplot(224) # 2*2划分画板,第4块子图
fig, axes = plt.subplots(nrows=2, ncols=2) # 直接生成2*2块子图的画板 axes[0,0].set(title='Upper Left') # 同上,用二维数组访问子图 axes[0,1].set(title='Upper Right') axes[1,0].set(title='Lower Left') axes[1,1].set(title='Lower Right')2.3 线图plot
# 指定x,y坐标即可画出线图 x = np.linspace(-np.pi,np.pi) y = np.sin(x) plt.plot(x,y , color='lightblue', linewidth=3) plt.xlim(-np.pi) plt.show()
通过关键字绘图,json格式保存数据:
x = np.linspace(0, 10, 200)
data_obj = {'x': x,
'y1': 2 * x + 1,
'y2': 3 * x + 1.2,
'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}
fig, ax = plt.subplots()
# 填充两条线之间的颜色
ax.fill_between('x', 'y1', 'mean', color='yellow', data=data_obj)
# Plot the "centerline" with `plot`
ax.plot('x', 'y2', color='black', data=data_obj)
plt.show()
2.4 散点图scatter
输入同上,只不过仅仅描绘点,不连边
2.4 柱状图
np.random.seed(1) x = np.arange(5) y = np.random.randn(5) fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2)) vert_bars = axes[0].bar(x, y, color='lightblue', align='center') horiz_bars = axes[1].barh(x, y, color='lightblue', align='center') #在水平或者垂直方向上画线 axes[0].axhline(0, color='gray', linewidth=2) axes[1].axvline(0, color='gray', linewidth=2) plt.show()2.5 箱型图
fig, (ax1, ax2) = plt.subplots(2) ax1.boxplot(data) ax2.boxplot(data2, vert=False) #控制方向2.6 气泡图
np.random.seed(19680801) N = 50 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = (30 * np.random.rand(N))**2 # 0 to 15 point radii plt.scatter(x, y, s=area, c=colors, alpha=0.5) plt.show()2.7 直方图
用于统计出现次数或频率
2.8 饼图labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs')
fig1, (ax1, ax2) = plt.subplots(2)
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)
ax1.axis('equal')
ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90, explode=explode,
pctdistance=1.12)
ax2.axis('equal')
ax2.legend(labels=labels, loc='upper right')
plt.show()
2.9 等高线
fig, (ax1, ax2) = plt.subplots(2) x = np.arange(-5, 5, 0.1) y = np.arange(-5, 5, 0.1) xx, yy = np.meshgrid(x, y, sparse=True) z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2) ax1.contourf(x, y, z) ax2.contour(x, y, z)3 属性方法 3.1 基本属性
# 属性备注 plt.X
-xlim: -ylim: xy轴的坐标左右界限
-xlabel: -ylabel: xy轴的坐标名称
-title:figure或subplot的名称
-legend(): 图例,默认自动识别最适合的位置,即best。此外,可以通过传参`loc=2`来指定位置,具体含10个位置
-xticks(范围,值list): 修改坐标显示的值
# plot:
color:线条颜色(lightblue,red)
linewidth:线条宽度
marker:线图标记(+)
linestyle:线条样式(dashed虚线)
label:str,用于显示图例或区分多线条
xticks()例子:
x = np.linspace(-np.pi,np.pi) y = np.sin(x) plt.plot(x,y , color='lightblue', linewidth=3, label='A') plt.plot(x,y+1 , linewidth=3, label='B') plt.legend(loc=4) plt.xlim(-np.pi) plt.xticks(np.arange(-3,4,2),[1,2,3,4]) plt.show()3.2 布局
通过fig.subplots_adjust()我们修改了子图水平之间的间隔wspace=0.5,垂直方向上的间距hspace=0.3,左边距left=0.125 等等,这里数值都是百分比的。以[0, 1] 为区间,选择left、right、bottom、top 注意 top和 right是 0.9 表示上、右边距为百分之10。不确定如果调整的时候,fig.tight_layout()是一个很好的选择。之前说到了内边距,内边距是子图的,也就是 Axes对象,所以这样使用 ax.margins(x=0.1, y=0.1),当值传入一个值时,表示同时修改水平和垂直方向的内边距。
fig, axes = plt.subplots(2, 2, figsize=(9, 9))
fig.subplots_adjust(wspace=0.5, hspace=0.3,
left=0.125, right=0.9,
top=0.9, bottom=0.1)
fig.tight_layout() #自动调整布局,使标题之间不重叠
plt.show()
3.3 axes子图
区别于subplot创建的子图,axes将在figure上创建子域,并且可以重叠。
fig = plt.figure() ax = fig.add_subplot(111) ax3 = fig.add_axes([0.3,0.2,0.4,0.5]) # fig.add_axes([left, bottom, width, height]) print(ax) plt.show()* 附录 1 axes和subplot的区别?
可以将figure看作画板,subplot可以看作将画板划分为若干个画布
* 参考- 官网doc
- Matplotlib教程~C语言中文网
- Python–Matplotlib~CSDN高评价文章



