Python - Matplotlib

Matplotlib 是一个用于在 Python 中绘制数组的 2D 图形库;
下面代码可以直接在python环境下运行;
文中可能不会解释全部函数,看代码中的注释会有很大的帮助,如有需要可以查阅官方文档;

目录

正文

例子1:如何生成多个子图
#生成数据
import random
import numpy as np
#随机产生20个1-50/30/20之间的整数(不包含50,30,20)
y1 = np.random.randint(1,50,20)
y2 = np.random.randint(1,30,20)
y3 = np.random.randint(1,15,20)

x = np.arange(20)
#创建一个的上下三子图, plt.subplot()
#演示中,三条线的颜色分别是'#1f77b4', '#ff7f0e', '#2ca02c'
#创建画布
plt.figure(1, figsize=(8,6), dpi=100)

#第一个子图,3代表三行,1代表1列,1代表第一个图
plt.subplot(3,1,1) 
plt.plot(x, y1, '--', label='Y1: Mean=%.2f'%np.mean(y1))
plt.xticks(x)
plt.yticks(np.arange(0,50,10))
plt.legend()

#第一个子图,3代表三行,1代表1列,2代表第二个图
plt.subplot(312) # 这一点可以略写的,当三个数都小于10
plt.plot(x, y2, '#ff7f0e', ls='--', label='Y2: Mean=%.2f'%np.mean(y2))
plt.xticks(x)
plt.yticks(np.arange(0,30,10))
plt.legend()

#第一个子图,3代表三行,1代表1列,3代表第三个图
plt.subplot(3,1,3) 
plt.plot(x, y3, 'g--', label='Y3: Mean=%.2f'%np.mean(y3))
plt.xticks(x)
plt.yticks(np.arange(0,20,5))
plt.legend()

#展示
plt.show()
  • plt.figure(num=None, figsize=None, dpi=None, facecolor=None):
    常用参数:
    • num:画布 (figure) 的 id.
    • figsize:画布的尺寸,默认=(6.4, 4.8).
    • dpi: 画布的像素, 默认=100
    • facecolor:画布的背景色 默认=“white”.
  • plt.subplot(int, int, index),返回一个axes(坐标轴,或者称为子图):
    常用参数:
    • int:第一个代表行.
    • int:第二个代表列.
    • index: 索引, 索引是从1开始从左往右,从上到下递增。

结果:
在这里插入图片描述

例子2:如何生成同轴的多个子图

  和例子1有两个不同,第一,plt.subplots()的使用而不是plt.subplot(). 第二,坐标轴的控制变成了axes.set_xticks().

#如何创建同y轴的上下三联图,需要plt.subplots()
fig, axes = plt.subplots(nrows=3,ncols=1,sharex=True,figsize=(8,6)) 
fig.suptitle('Title of this figure')

#subplot1
axes1 = axes[0]
axes1.plot(x, y1, color='#1f77b4', ls='--', label='Y1: Mean=%.2f'%np.mean(y1))
axes1.legend()

#subplot2
axes2 = axes[1]
axes2.plot(x, y2, color='#ff7f0e', ls='--', label='Y2: Mean=%.2f'%np.mean(y2))
axes2.set_yticks(np.arange(0,30,10))
axes2.legend()

#subplot3
axes3 = axes[2]
axes3.plot(x, y3, 'g--', label='Y3: Mean=%.2f'%np.mean(y3))
axes3.set_yticks(np.arange(0,20,5))
axes3.set_xticks(x)
axes3.grid(True) #是否产生网格
axes3.legend()

#展示图片
plt.show()
  • plt.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, figsize=(6.4, 4.8)),它返回一个figure,和坐标轴们。
    常用参数:
    • nrows:几行
    • ncols:几列
    • sharex, sharey:是否共享x/y轴,取值: {‘none’, ‘all’, ‘row’, ‘col’}. True/all,所有子图共享子图;row,每行子图共享x/y轴;col,每列子图共享x/y轴。
    • figsize:图的尺寸
       
  • axes.set_xticks(),其他相似的函数:
    • axes.set_xlim((-3,5)),axes.set_ylim((-3,3))
    • axes.set_xlabel(‘x轴’, fontsize=15), axes.set_ylabel(‘y轴’, fontsize=15, color=‘red’)

结果:
在这里插入图片描述

例子3:如何在一个图里生成两条不同y轴的线
#例子3:如何一个图生成不同y轴的线
fig, ax1 = plt.subplots(figsize=(8,6))

#创建一个图
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y1-values', color='b')
ax1.plot(x, y1, color='b', ls='--', lw=2)
ax1.set_xticks(x)
ax1.tick_params(axis='y', labelcolor='b')

ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

#创建另一个同y轴的图
ax2.set_ylabel('y3-values', color='r')  # we already handled the x-label with ax1
ax2.plot(x, y3, color='r', ls='--', lw=2)
ax2.tick_params(axis='y', labelcolor='r')

#否则y轴的label会被省略
fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()
  • axes2 = axes1.twinx():
    生成一个和axes1共享x轴的坐标轴。

结果:
在这里插入图片描述

例子4:多个子图常见的问题

这个例子将会给多子图的画布补充一些细节。例如,画布整体的x、y轴标签和title的位置。每一列的y轴的标签等。通过下面的代码可以生成一个更多信息的图,如下图:
下面例子的结果

生成数据:

#Read data
import numpy as np
import matplotlib.pyplot as plt

c01 = [0.58, 0.94, 0.38, 0.96, 0.85, 0.36, 0.28, 0.46, 0.41, 0.75]
c1 = [0.76, 0.08, 1.0, 0.94, 0.05, 0.26, 0.17, 0.7, 0.33, 0.96]
c10 = [0.52, 0.3 , 0.08, 0.75, 0.67, 0.55, 0.83, 0.91, 0.85, 0.96]
c100 = [0.76, 0.31, 0.2, 0.35, 0.86, 0.16, 0.99, 0.6, 0.94, 0.92]
c1000 = [0.72, 0.2, 0.51, 0.81, 0.39, 0.33, 0.58, 0.88, 0.91, 0.94]

xaxis = np.arange(10)

作图:

#Plot
#生成画布,设置画布的title,整体的X/Y轴方向的文字,新函数fig.delaxes(ax[2,1])
fig, ax = plt.subplots(3,2, sharex='col', sharey=True, figsize=(12,10))
fig.delaxes(ax[2,1])  #删除最后一个子图
fig.suptitle('Visualization of the Random numbers and their Mean value', fontsize='x-large', y=0.94)  #y=[0-1]可以控制title的位置
#设置所有子图x、y轴标签
fig.text(0.06, 0.5, 'Yaxis - Create this Ylabel by fig.text() function -- line18', va='center', rotation='vertical', fontsize='x-large')
fig.text(0.5, 0.05, 'Xaxis - Create this Xlabel by fig.text() function -- line19', va='center', ha='center', fontsize='x-large')
fig.text(0.72, 0.2, 'This Axes was deleted by fig.delaxes(ax[2,1])', va='center', ha='center', fontsize='x-large', color='b')

#第一个子图的内容
ax1 = ax[0,0]
ax1.plot(xaxis, c01, color='#1f77b4', ls='--', label='C=0.1; Mean=%.2f'%np.mean(c01))
ax1.set_title('The Results for C = 0.1')  #设置子图的小标题
ax1.grid(True)  #显示网格
ax1.legend(loc='lower left')  #图示的显示和位置

#第二个子图
ax2 = ax[0,1]
ax2.plot(xaxis, c1, color='#ff7f0e', ls='--', label='C=1; Mean=%.2f'%np.mean(c1))
ax2.set_title('The Results for C = 1')
ax2.set_ylabel('Y label content')  #设置子图的y轴坐标
ax2.grid(True)
ax2.legend(loc='lower left')

#第三个子图
ax3 = ax[1,0]
ax3.plot(xaxis, c10, 'g--', label='C=10; Mean=%.2f'%np.mean(c10))
ax3.set_title('The Results for C = 10')
ax3.set_ylabel('Y label content')
ax3.grid(True)
ax3.legend(loc='lower left')

#第四个子图,新函数set_tick_params()
#设置第四个子图的x轴坐标显示内容
ax4xlabels = ['TheRestultofNO.1','TheRestultofNO.2','TheRestultofNO.3','TheRestultofNO.4','TheRestultofNO.5','TheRestultofNO.6','TheRestultofNO.7','TheRestultofNO.8','TheRestultofNO.9','TheRestultofNO.10']

ax4 = ax[1,1]
ax4.plot(xaxis, c100, 'b--', label='C=100; Mean=%.2f'%np.mean(c100))
ax4.set_title('The Results for C = 100')
ax4.set_xticks(xaxis)   #设置x轴
ax4.set_xticklabels(ax4xlabels, ha='right')  #设置x轴显示内容
ax4.set_xlabel('The Number of Evaluation', fontsize='x-large')
ax4.xaxis.set_tick_params(which='both', labelbottom=True, labeltop=False, labelrotation=45)  #控制x轴的显示
ax4.grid(True)
ax4.legend(loc='lower left')

#第五个子图
ax5 = ax[2,0]
ax5.plot(xaxis, c1000, 'r--', label='C=1000; Mean=%.2f'%np.mean(c1000))
ax5.set_title('The Results for C = 1000')
ax5.grid(True)
ax5.legend(loc='lower left')

ax5.set_ylim(0,1.05)
ax5.set_xticks(xaxis)
ax5.set_xlabel('The Number of Evaluation', fontsize='x-large', va='top')

plt.show()

可能遇到的问题:

  • 问题1:如何生成奇数个子图?例如画中,画布生成了六个子图,如何只保留5个?
    使用函数 fig.delaxes() 删除想删除的子图。
  • 问题2:当删除最后一张图后,只显示第一列的x轴坐标,不显示第二列的x轴坐标。
    它是因为共享x轴之后,x轴坐标只显示在最下面的图下。可以通过 ax4.xaxis.set_tick_params() 设置强制显示。
    主要参数:
    • axis:控制强制显示x轴还是y轴的内容,可选 {‘x’, ‘y’, ‘both’}。
    • which:控制强制显示major ticks 还是minor ticks的内容,可选 {‘major’, ‘minor’, ‘both’}。–> Major/ Minor ticks 的区别
    • labelbottom, labeltop, labelleft, labelrightbool: 控制子图的那个地方label强制显示,bool型变量。
    • labelrotation:控制label旋转的角度。
    • 官方文档:axes.xaxis.set_tick_params()
  • 问题3:如何生成一个所有子图都共用的x、y轴标签
    使用函数 fig.text() 函数控制显示。
    • x,y: 文本的位置,它是通过百分比控制x、y的在图中的相对位置
    • s:文本的内容
    • 官方文档:fig.text()
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐