1. 介绍 Matplotlib
是一个用于绘制图表和可视化数据的 Python
库。它提供了丰富的绘图工具,可以用于生成各种静态、交互式和动画图表。Matplotlib
是数据科学、机器学习和科学计算领域中最流行的绘图库之一。
1.1 关键特性 以下是 Matplotlib
的一些关键特性:
简单易用: Matplotlib
提供了简单而直观的 API
,使得用户能够轻松创建各种类型的图表。
多种绘图类型: 支持绘制各种类型的图表,包括线图、散点图、柱状图、饼图、等高线图、3D 图表等。
自定义性强: 用户可以轻松地自定义图表的外观和样式,包括颜色、线型、标签、标题等。
支持 LaTex: 支持使用 LaTeX
渲染文本,使得图表标签和注释可以具有高质量的数学表达式。
交互式图表: Matplotlib
可以嵌入到交互式环境中,如 Jupyter Notebook
,支持交互式数据探索和动态更新。
支持多种输出格式: 可以将图表保存为多种格式,如 PNG、PDF、SVG、EPS
等。
对象导向: Matplotlib
的图表是通过对象导向的方式创建的,这意味着用户可以直接操作图表的元素,使得定制化和复杂的图表更加容易。
内置样式和颜色映射: 提供了内置的样式表和颜色映射,使得用户可以轻松地应用一致的风格和颜色。
复杂图表和子图: 支持创建复杂的图表布局和多子图,适用于需要展示多个数据视图的场景。
跨平台: 可以在多个操作系统上运行,包括 Windows、Linux 和 macOS
。
1.2 其他介绍 Github(截止当前 18.2K):https://github.com/matplotlib/matplotlib
2. 安装&升级 2.1 安装 $ pip install matplotlib $ conda install matplotlib
2.2 升级 $ pip install --upgrade matplotlib $ conda update matplotlib
3. 绘图风格 3.1 对象风格 使用面向对象的风格画图,首先要创建画布(大容器),然后在画布中填充子图信息(小容器)
import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__' : plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False fig = plt.figure() fig.set_size_inches(7 , 5 ) fig.set_facecolor('ivory' ) subImg = fig.add_axes([0.1 , 0.1 , 0.8 , 0.8 ]) x = np.linspace(0 , 10 , 20 ) y1 = np.power(x, 2 ) y2 = x * 10 subImg.plot(x, y1, 'r' , ls='-' , linewidth=2 , label='$x^2$' ) subImg.plot(x, y2, 'b' , ls='--' , linewidth=2 , label='$x*10$' ) subImg.text(3.4 , 7.5 , r'$x^2$' , fontsize=12 ) subImg.text(1 , 7.5 , r'$x*10$' , fontsize=12 ) subImg.set_title("子图A标题" , fontdict={'size' : 16 }) subImg.legend(loc='upper left' ) subImg.set_xlabel('X轴' , fontdict={'size' : 14 }) subImg.set_ylabel('Y轴' , fontdict={'size' : 14 }) plt.show()
3.2 API风格 除此上文风格,Matplotlib
还提供一种类MATLAB
风格的API
,这种使用方式没有画布和子图的概念,直接调用函数即可绘图和显示。
实现上面的图片效果代码如下:
import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__' : plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False x = np.linspace(0 , 10 , 20 ) y1 = np.power(x, 2 ) y2 = x * 10 plt.plot(x, y1, 'r' , ls='-' , linewidth=2 , label='$x^2$' ) plt.plot(x, y2, 'b' , ls='--' , linewidth=2 , label='$x*10$' ) plt.text(3.4 , 7.5 , r'$x^2$' , fontsize=12 ) plt.text(1 , 7.5 , r'$x*10$' , fontsize=12 ) plt.title("示例标题" , fontdict={'size' : 16 }) plt.legend(loc='upper left' ) plt.xlabel('X轴' ) plt.ylabel('Y轴' ) plt.show()
4. 快速绘图 4.1 折线图
plt.plot()
: 主要用于绘制折线图的主要函数之一。
import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__' : plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False x = np.linspace(0 , 10 , 20 ) y1 = np.power(x, 2 ) y2 = x * 10 plt.subplot(1 , 2 , 1 ) plt.title("图一" ) plt.plot(x, y1) plt.subplot(1 , 2 , 2 ) plt.title("图二" ) plt.plot(x, y2) plt.show()
4.2 曲线图 严格来说,plot( )
函数绘制的是折线图而非曲线图,因为该函数只是将顺序相邻的点以直线连接,如想画曲线图,推荐使用semilogx( )、semilogy( )和loglog( )
等函数。
import matplotlib.pyplot as pltimport numpy as np plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False if __name__ == '__main__' : x = np.linspace(1 , 10 , 100 ) y = np.exp(x) fig, (ax1, ax2, ax3) = plt.subplots(1 , 3 , figsize=(15 , 5 )) ax1.semilogx(x, y, label='对数x轴折线图' ) ax1.set_title('semilogx() 示例' ) ax1.set_xlabel('对数X轴' ) ax1.set_ylabel('Y轴' ) ax1.legend() ax2.semilogy(x, y, label='对数y轴折线图' ) ax2.set_title('semilogy() 示例' ) ax2.set_xlabel('X轴' ) ax2.set_ylabel('对数Y轴' ) ax2.legend() ax3.loglog(x, y, label='对数坐标轴折线图' ) ax3.set_title('loglog() 示例' ) ax3.set_xlabel('对数X轴' ) ax3.set_ylabel('对数Y轴' ) ax3.legend() plt.tight_layout() plt.show()
4.3 柱状图
plot.bar()
: 用来绘制垂直柱状图
plot.barh()
: 用来绘制水平柱状图
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False if __name__ == '__main__' : names = ['孙悟空' , '猪八戒' , '唐僧' , '沙僧' ] values = [36 , 24 , 75 , 45 ] plt.title("年龄分布图" ) fig, (ax1, ax2) = plt.subplots(1 , 2 , figsize=(12 , 5 )) ax1.bar(names, values, color='blue' ) ax1.set_title('垂直条形图示例' ) ax1.set_xlabel('姓名' ) ax1.set_ylabel('年龄' ) ax2.barh(names, values, color='green' ) ax2.set_title('水平条形图示例' ) ax2.set_xlabel('年龄' ) ax2.set_ylabel('姓名' ) plt.tight_layout() plt.show()
4.4 散点图 scatter()
函数用于绘制散点图,散点图是一种展示两个变量之间关系的常见图表类型。每个点的位置由两个变量的值决定,横轴表示一个变量,纵轴表示另一个变量。
1. 参数说明 scatter(x, y, s=None , c=None , marker=None , cmap=None , norm=None , vmin=None , vmax=None , alpha=None , linewidths=None , edgecolors=None , *, plotnonfinite=False , data=None , **kwargs)
x, y: 必需,表示散点图上点的横坐标和纵坐标。
s: 用于指定散点的大小。可以是一个标量,表示所有点的大小相同;也可以是一个数组,表示每个点的大小。
c: 用于指定散点的颜色。可以是一个标量,表示所有点的颜色相同;也可以是一个数组,表示每个点的颜色。此外,你还可以通过设置 c
参数为字符串值来表示使用预定义的颜色映射。
marker: 用于指定散点的标记样式,例如 ‘o’ 表示圆点,’^’ 表示三角形等。
cmap: 用于指定颜色映射,仅当 c
参数为数组时起作用。更多颜色参考文档: https://matplotlib.org/stable/users/explain/colors/colormaps.html
norm: 用于标准化颜色映射。
alpha: 用于指定散点的透明度,取值范围为 0(完全透明)到 1(完全不透明)。
linewidths: 用于指定散点边缘的线宽。
edgecolors: 用于指定散点边缘的颜色。
2. 代码示例 import matplotlib.pyplot as pltimport numpy as np plt.rcParams['font.sans-serif' ] = ['FangSong' ] plt.rcParams['axes.unicode_minus' ] = False if __name__ == '__main__' : x = np.random.randn(50 ) y = np.random.randn(50 ) color = 10 * np.random.rand(50 ) area = np.square(30 * np.random.rand(50 )) plt.scatter(x, y, label="数据点" , c=color, marker="o" , s=area, cmap='flag' , edgecolor='r' ) plt.title("散点图示例" ) plt.xlabel("X轴" ) plt.ylabel("Y轴" ) plt.legend() plt.show()
4.5 饼图 1. 参数说明 pie( x, explode=None , labels=None , colors=None , autopct=None , pctdistance=0.6 , shadow=False , labeldistance=1.1 , startangle=0 , radius=1 , counterclock=True , wedgeprops=None , textprops=None , center=(0 , 0 ), frame=False , rotatelabels=False , *, normalize=True , hatch=None , data=None )
x: 必需,表示每个部分的大小,可以是一个数组或一个标量。如果是一个数组,表示每个扇形的大小;如果是一个标量,表示所有扇形的大小相同。
explode: 用于指定哪些扇形被拉出。如果某个值大于0,表示对应索引的扇形会被拉出一定的距离。
labels: 扇形上显示的标签,可以是一个数组或 None。
colors: 扇形的颜色,可以是一个颜色列表,表示每个扇形的颜色;也可以是 None,表示使用默认颜色。
autopct: 控制在饼图上显示每个部分的百分比,可以是字符串格式化,例如 ‘%1.1f%%’。
pctdistance: 百分比标签与圆心的距离,取值范围为 [0, 1]。
shadow: 是否在饼图下方添加阴影。
labeldistance: 标签与圆心的距离,取值范围为 [0, 1]。
startangle: 饼图起始角度,按逆时针方向计算,0 度表示从正 x 轴开始。
radius: 饼图的半径。
counterclock: 是否按逆时针方向绘制饼图。
wedgeprops: 扇形的属性字典,用于设置扇形的样式,例如边界颜色、边界宽度等。
textprops: 标签的属性字典,用于设置标签的样式,例如字体大小、颜色等。
center: 饼图的中心坐标。
frame: 是否绘制一个带有刻度标签的坐标轴框架。
rotatelabels: 是否旋转标签。
normalize: 如果为 True,则将 x 归一化为百分比。
2.代码示例 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif" ] = ["FangSong" ] plt.rcParams["axes.unicode_minus" ] = False if __name__ == '__main__' : labels = ['Go' , 'PHP' , 'C' , 'Java' , 'Python' ] sizes = [15 , 5 , 19.5 , 20 , 40.5 ] explode = (0 , 0.1 , 0 , 0 , 0 ) plt.pie(sizes, labels=labels, autopct='%1.1f%%' , startangle=90 , explode=explode, colors=['gold' , 'lightskyblue' , 'lightcoral' , 'lightgreen' , 'purple' ]) plt.title('后端编程语言占比' ) plt.show()
4.6 等值线图 import matplotlib.pyplot as pltimport numpy as np plt.rcParams["font.sans-serif" ] = ["FangSong" ] plt.rcParams["axes.unicode_minus" ] = False if __name__ == '__main__' : x = np.linspace(-5 , 5 , 100 ) y = np.linspace(-5 , 5 , 100 ) X, Y = np.meshgrid(x, y) Z = np.sin(np.sqrt(X ** 2 + Y ** 2 )) fig, (ax1, ax2) = plt.subplots(1 , 2 , figsize=(12 , 5 )) contour_plot = ax1.contour(X, Y, Z, levels=20 , cmap='viridis' ) fig.colorbar(contour_plot, label='Z值' ) ax1.set_title('等值线图示例' ) ax1.set_xlabel('X轴' ) ax1.set_ylabel('Y轴' ) contour_plot = ax2.contourf(X, Y, Z, levels=20 , cmap='viridis' ) fig.colorbar(contour_plot, label='Z值' ) ax2.set_title('等值线图(填充)' ) ax2.set_xlabel('X轴' ) ax2.set_ylabel('Y轴' ) plt.show()
4.7 矢量合成图 矢量合成图以箭头的形式绘制矢量,因此也被称为箭头图。矢量合成图以箭头的方向表示矢量的方向。
import matplotlib.pyplot as pltimport numpy as np plt.rcParams["font.sans-serif" ] = ["FangSong" ] plt.rcParams["axes.unicode_minus" ] = False if __name__ == '__main__' : vector1 = np.array([3 , 2 ]) vector2 = np.array([-1 , 4 ]) resultant_vector = vector1 + vector2 fig, ax = plt.subplots() ax.arrow(0 , 0 , vector1[0 ], vector1[1 ], head_width=0.2 , head_length=0.2 , fc='blue' , ec='blue' , label='矢量1' ) ax.arrow(0 , 0 , vector2[0 ], vector2[1 ], head_width=0.2 , head_length=0.2 , fc='red' , ec='red' , label='矢量2' ) ax.arrow(0 , 0 , resultant_vector[0 ], resultant_vector[1 ], head_width=0.2 , head_length=0.2 , fc='green' , ec='green' , label='结果' ) ax.set_xlim(-2 , 5 ) ax.set_ylim(-1 , 8 ) ax.grid(True ) ax.set_xlabel('X轴' ) ax.set_ylabel('Y轴' ) ax.set_title('矢量图示例' ) ax.legend() plt.show()