【Python】Matplotlib简要教程

文章目录

一、简介

Matplotlib 是一个用于创建静态、动态和交互式图表的 Python 绘图库。它提供了大量的图表类型和工具,适用于数据分析和可视化。

Matplotlib是Python语言及其数值计算库NumPy的绘图库。它提供了一个面向对象的API,可以将绘图嵌入到使用通用GUI工具包(如Tkinter、wxPython、Qt或GTK)的程序中。它还有一个基于状态机(就像OpenGL)的过程式编程"pylab"接口,其设计与MATLAB非常类似。

Matplotlib文档:https://matplotlib.org/stable/index.html

核心特性:

  1. 丰富的图表类型:

    • 线图、散点图、条形图、饼图、直方图等。
    • 高级图表如等高线图、3D 图表、热力图等。
  2. 高度自定义:

    • 图形的各种属性(如颜色、线型、标记、标签等)可以自定义。
    • 可以添加标题、标签、图例、网格等。
  3. 兼容性强:

    • 支持多种输出格式,包括 PNG、PDF、SVG、EPS 等。
    • 与 NumPy 和 Pandas 等库紧密集成,方便数据处理和分析。
  4. 交互性:

    • 支持交互式绘图,能够响应用户操作。
    • 与 Jupyter Notebook 和 IPython 配合使用,可以创建动态的交互式图表。

如果你用过matlab,那就太好了,Matplotlib很多地方和matlab是相似的。


绘图还有很多不错的其它软件、库,如(只是我用过的):matlab、R、echarts、D3,当然还有plotly 、Tableau 、Power BI 等。

Echarts是基于JS的,在网页上绘图很好用,我最开始用的时候他还是百度的,现在已经转移到 Apache 软件基金会了:https://echarts.apache.org/handbook/zh/get-started/

二、一些基本概念

使用 Matplotlib 进行绘图,了解以下基本概念和操作是非常重要的:

2.1 图表元素

在 Matplotlib 中,一个图形(Figure)包含多个元素,每个元素负责不同的功能。下面是各个元素的详细介绍及其在图中的作用:

元素 作用 描述
Figure 图形容器 整个图形的顶层容器,可以包含一个或多个子图(Axes)。使用 plt.figure() 创建。
Axes 子图区域 在 Figure 中定义实际的绘图区域。每个 Axes 对象表示一个坐标系。使用 plt.subplots() 创建。
Axis 坐标轴 Axes 中的坐标轴对象,用于刻度和标签的管理。每个 Axes 对象有两个 Axis(x 和 y)。
Title 图表标题 图表的标题,通常放在图表的顶部。使用 ax.set_title() 设置。
Legend 图例 用于解释不同数据系列的标签。使用 ax.legend() 添加。
Label 坐标轴标签 X 轴和 Y 轴的标签。使用 ax.set_xlabel()ax.set_ylabel() 设置。
Major tick 主刻度 主要刻度线,通常用于显示轴上的主要刻度值。使用 ax.xaxis.set_major_locator()ax.yaxis.set_major_locator() 设置。
Minor tick 次刻度 辅助刻度线,用于更详细的刻度显示。使用 ax.xaxis.set_minor_locator()ax.yaxis.set_minor_locator() 设置。
Spine 坐标轴的边框 Axes 边缘的线条,通常用于围绕绘图区域。可以使用 ax.spines['top'] 等访问和设置。
Grid 网格线 背景网格线,帮助读取数据值。使用 ax.grid() 显示或隐藏。
Line 数据线 连接数据点的线条。使用 ax.plot() 绘制。
Markers 数据点标记 在数据点上显示的符号(如圆点、方块等)。可以通过 ax.plot()marker 参数设置。

2.2 常见图表类型

图表类型 简介 对应的方法
线图 通过连接数据点的线条显示数据的变化趋势 plot()
散点图 使用点显示两组数据的关系 scatter()
条形图 使用矩形条来显示不同类别的数据 bar(), barh()
饼图 显示各部分在整体中的比例 pie()
直方图 显示数据的分布情况,通过分桶统计数据频率 hist()
箱线图 显示数据的分布特征,包括中位数、四分位数及异常值 boxplot()
面积图 显示随时间变化的数量,类似于线图但通过填充线条下方的区域表示 fill_between(), stackplot()
热力图 显示数据的密度或频率,通过颜色表示不同数值的大小 imshow(), pcolormesh(), heatmap() (seaborn)
极坐标图 使用极坐标系绘制数据,适合显示角度和半径的数据 polar()
等高线图 显示三维数据的等高线,通过等值线表示不同高度 contour(), contourf()
气泡图 类似于散点图,但通过点的大小表示第三个变量的数据 scatter()(通过设置点的大小)
阶梯图 显示数据的阶梯变化,通常用于显示分段恒定值的变化 step()
蜡烛图 显示金融数据的价格变动,通常用于股票和期货市场分析 mpl_finance.candlestick_ohlc() (需要额外安装 mpl_finance 库)
三维图 显示三维空间中的数据,适合展示复杂的三维关系 plot_surface(), scatter3D(), plot_wireframe()
雷达图 显示多变量数据,通常用于展示多种特征的综合表现 plot()(通过极坐标系实现)

一些示例:

2.3 主要绘图函数及其返回值

以下是一些常用的 Matplotlib 绘图函数及其返回的对象类型。

绘图函数 返回值类型 说明
plot() Line2D 对象列表 绘制折线图或散点图,每条线对应一个 Line2D 对象
scatter() PathCollection 对象 绘制散点图,返回一个 PathCollection 对象
bar() BarContainer 对象 绘制柱状图,返回一个 BarContainer 对象
hist() 列表 绘制直方图,返回(n, bins, patches
boxplot() 字典 绘制箱线图,返回一个包含多个 Line2DPatch 对象的字典
pie() 列表 绘制饼图,返回 Wedge 对象的列表
imshow() AxesImage 对象 显示图像数据,返回一个 AxesImage 对象
contour() QuadContourSet 对象 绘制等高线图,返回一个 QuadContourSet 对象
contourf() QuadContourSet 对象 绘制填充等高线图,返回一个 QuadContourSet 对象
pcolormesh() QuadMesh 对象 绘制伪彩色图,返回一个 QuadMesh 对象
errorbar() ErrorbarContainer 对象 绘制带误差条的图,返回一个 ErrorbarContainer 对象

2.4 Artists 的概念

在 Matplotlib 中,"Artists" 是一个广泛使用的概念,它指的是图形元素的抽象表示。所有在图形上绘制的内容都是一个 Artist 对象,包括但不限于图形、文本、标签、图例等。

Artists 可以分为以下几类:

  1. 基本元素 (Primitive Elements)

    • 这些是最基本的图形元素,例如 Line2DRectangleCircleText 等。
  2. 容器 (Containers)

    • 这些是用于组织其他 Artist 的对象。例如,Figure 是最高级别的容器,它包含所有的绘图;Axes 是次一级的容器,它包含具体的绘图区域和图形元素。

以下是一些常见的 Artist 类及其用途:

类名 说明
Figure 整个图形窗口或绘图区域,是最高级别的容器
Axes 一个具体的绘图区域,包含坐标轴、标题、标签等
Axis 坐标轴,包括刻度、标签等
Line2D 用于绘制二维线条
Rectangle 用于绘制矩形
Circle 用于绘制圆形
Text 用于绘制文本
Patch 用于绘制任意形状的图形,如多边形
Legend 用于绘制图例
Image 用于绘制图像

概念,有助于你理解官网文档。

三、基本图表详解

你也可以去看官网的例子,都有代码的:https://matplotlib.org/stable/plot_types/index.html

以及更全的示例,有几百种图:https://matplotlib.org/stable/gallery/index.html

太多了,详解几个常见的吧。

本节我会在第一个绘图示例中讲解一些图表通用的属性设置。

3.1 成对数据

3.11 折线图:plot()

matplotlib.pyplot.plot() 方法是最常用的绘图函数之一。它通常用于创建折线图,但也可以用来绘制其他类型的图形。

基本用法:

python 复制代码
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [1, 4, 9, 16]

plt.plot(x, y)
plt.show()

🟢必选参数: x, y :这两个参数分别是 X 轴和 Y 轴的数据,可以是列表、元组、NumPy 数组等。xy 的长度必须相同。没数据就画不出图了。

🟢可选参数:主要用来设置图表的样式:如线条样式、轴标签、轴取值等等。

🟢函数返回值:matplotlib.pyplot.plot()返回值是一个 Line2D 对象的列表 (一条线就是一个Line2D对象的列表,访问记得加索引)。Line2D 对象表示绘制的线条或数据系列。每个 Line2D 对象包含有关绘图线条的信息,例如数据点、样式、颜色等。

🟨设置图表样式

🟣(1)直接通过matplotlib.pyplot.plot()的可选参数设置

这种方法的优点就是简单快捷。

先看示例:

python 复制代码
plt.plot(x, y, 
         color='purple',          # 线条颜色
         linestyle=':',           # 线条样式
         marker='o',              # 标记样式
         markersize=8,            # 标记大小
         linewidth=2.0,           # 线条宽度
         alpha=0.7,               # 透明度
         label='Data Line')       # 图例标签

以下是 matplotlib.pyplot.plot() 方法的常用可选参数的详细列表:

参数 类型 描述 示例
color 字符串、十六进制颜色码、RGB 元组 线条的颜色。可以用颜色名称、十六进制颜色码或 RGB 元组指定。 'red', '#FF0000', (1, 0, 0)
linestyle 字符串 线条的样式。常用样式包括实线、虚线、点线等。 '-'(实线), '--'(虚线), ':'(点线), '-.'(点划线)
linewidth 浮点数 线条的宽度。默认为 1.0。 2.0
marker 字符串 数据点的标记样式。常用标记包括圆点、方块、三角形等。 'o'(圆点), 's'(方块), '^'(三角形)
markersize 浮点数 标记的大小。默认为 6。 10
label 字符串 图例中的标签。和 plt.legend()配合使用。 'Data Line'
alpha 浮点数 线条的透明度,范围从 0(完全透明)到 1(完全不透明)。 0.5
zorder 整数 图形的层级顺序,较高的值使图形位于较上层。 2
markeredgecolor 字符串、十六进制颜色码、RGB 元组 标记边缘的颜色。 'black', '#000000'
markeredgewidth 浮点数 标记边缘的宽度。默认为 1。 1.5
markerfacecolor 字符串、十六进制颜色码、RGB 元组 标记内部的颜色。 'blue', '#0000FF'
dashes 序列或布尔值 自定义虚线样式。传递一个包含线段和间隔的序列。 (5, 2, 1, 2)
clip_on 布尔值 是否裁剪超出轴范围的部分。默认为 True False
picker 布尔值、函数 允许点击图形元素进行交互。 True
dash_capstyle 字符串 虚线的端点样式。可选值包括 'butt''round''projecting' 'round'
dash_joinstyle 字符串 虚线的连接样式。可选值包括 'miter''round''bevel' 'round'

线条的颜色、样式和标记可以使用格式化字符串(format string)来指定,而不用分别设置color、linestyle、maker这3个参数,即:

python 复制代码
plt.plot(x, y,  color='red', linestyle='-',marker='o')
# 等价于
plt.plot(x,y,'r-o')

注意:

  • 格式字符串必须紧跟x、y数据后面,不能放在其它参数后面;
  • 格式字符串后面还可以照常设置其它参数;
  • 颜色、线形、标记可以设置任意数量,如'r','ro','r-o';
  • 当颜色与其他参数一起指定时,颜色值只能用简写,'red-o'是错的;
  • 只指定一个参数时,颜色可以用任何表示方法,线形和标记只能用简写。

🔹颜色表示:

支持的格式:

  • RGB元组:如,(0.1, 0.2, 0.5)
  • RGBA元组:如,(0.1, 0.2, 0.5, 0.3)。和rgb一样取值在[0,1],rgba最后一位是透明度。
  • 十六进制RGB或RGBA字符串'#abc'等价'#aabbcc'。不区分大小写,
  • 灰度值的闭区间内浮点值的字符串表示:如'0'是黑色,'1'是白色。
  • 基本颜色的简写字符串(使用格式化字符串时必须使用):
    • 'b' as blue
    • 'g' as green
    • 'r' as red
    • 'c' as cyan
    • 'm' as magenta
    • 'y' as yellow
    • 'k' as black
    • 'w' as white

还有一些其它的颜色表示方法也支持,不常用,不展开了。

这些颜色表示方法,不只是color参数能用,其它需要设置颜色的参数,也可以灵活使用的。

🔹线形表示:

蓝色是给参数赋值是使用的格式。

注意,格式化字符串中,只能使用:'-' 表示 'solid'、'--' 表示'dashed'、'-.' 表示'dashdot'、':' 表示'dotted'。

🔹标记表示:

常用的:


🟣(2)通过 matplotlib.pyplot.plot()返回的 Line2D 对象来设置和调整图形的样式和属性

这种方式提供更细粒度的控制、更高的代码灵活性、方便修改和更新。

Line2D 对象是 matplotlib 中的一个核心类,用于表示和控制绘图中的线条。它包含了有关线条的所有属性和方法,可以用来创建、修改和查询线条的各种特性。

.plot()画了几条线,返回的Line2D对象列表就有几个元素,分别代表这些线。

写法:

python 复制代码
f = plt.plot(x,y)
f, = plt.plot(x,y)
f = plt.plot(x1,y1,x2,y2) 
f1,f2 = plt.plot(x1,y1.x2,y2)

第1、3行的写法,返回值是列表。2、4行返回值则是对应的Line2D对象(Python的解包赋值)。

解包赋值(unpacking assignment)是 Python 中的一种语法特性,允许你将一个序列(如列表、元组等)中的多个元素一次性赋值给多个变量。这种方式可以简化代码,并使得变量赋值变得更加直观。左右元素数量要相等。

🔹Line2D对象支持的方法:

方法 说明
get_alpha() 获取线条的透明度
get_animated() 检查线条是否设置为动画
get_antialiased() 获取线条的抗锯齿设置
get_c() 获取线条的颜色
get_clip_box() 获取裁剪边界框
get_clip_on() 检查裁剪是否启用
get_clip_path() 获取裁剪路径
get_color() 获取线条的颜色
get_contains() 获取包含测试函数
get_dash_capstyle() 获取虚线端点样式
get_dash_joinstyle() 获取虚线连接样式
get_dashes() 获取虚线样式
get_data() 获取 x 和 y 数据
get_drawstyle() 获取绘制样式
get_ec() 获取标记的边缘颜色
get_figure() 获取所属的 Figure 对象
get_fillstyle() 获取标记的填充样式
get_gid() 获取对象的全局唯一标识符
get_hatch() 获取填充图案
get_label() 获取线条的标签
get_linestyle() 获取线条样式
get_linewidth() 获取线条宽度
get_ls() 获取线条样式(别名)
get_lw() 获取线条宽度(别名)
get_marker() 获取标记样式
get_markeredgecolor() 获取标记的边缘颜色
get_markeredgewidth() 获取标记的边缘宽度
get_markerfacecolor() 获取标记的填充颜色
get_markerfacecoloralt() 获取标记的替代填充颜色
get_markersize() 获取标记大小
get_markevery() 获取标记的间隔
get_path() 获取线条的路径
get_picker() 获取拾取属性
get_pickradius() 获取拾取半径
get_transform() 获取变换属性
get_visible() 检查线条是否可见
get_xdata() 获取 x 轴数据
get_ydata() 获取 y 轴数据
set_alpha(alpha) 设置线条的透明度
set_animated(b) 设置线条是否为动画
set_antialiased(b) 设置线条的抗锯齿
set_c(c) 设置线条的颜色
set_clip_box(rect) 设置裁剪边界框
set_clip_on(b) 设置裁剪是否启用
set_clip_path(path, transform) 设置裁剪路径
set_color(c) 设置线条的颜色
set_contains(picker) 设置包含测试函数
set_dash_capstyle(s) 设置虚线端点样式
set_dash_joinstyle(s) 设置虚线连接样式
set_dashes(seq) 设置虚线样式
set_data(x, y) 设置 x 和 y 数据
set_drawstyle(s) 设置绘制样式
set_figure(fig) 设置所属的 Figure 对象
set_fillstyle(s) 设置标记的填充样式
set_gid(gid) 设置对象的全局唯一标识符
set_hatch(hatch) 设置填充图案
set_label(label) 设置线条的标签
set_linestyle(s) 设置线条样式
set_linewidth(w) 设置线条宽度
set_marker(m) 设置标记样式
set_markeredgecolor(ec) 设置标记的边缘颜色
set_markeredgewidth(ew) 设置标记的边缘宽度
set_markerfacecolor(fc) 设置标记的填充颜色
set_markerfacecoloralt(fc) 设置标记的替代填充颜色
set_markersize(sz) 设置标记大小
set_markevery(every) 设置标记的间隔
set_path_effects(path_effects) 设置路径效果
set_picker(picker) 设置拾取属性
set_pickradius(r) 设置拾取半径
set_transform(t) 设置变换属性
set_url(url) 设置 URL
set_visible(b) 设置线条是否可见
set_xdata(x) 设置 x 轴数据
set_ydata(y) 设置 y 轴数据

如果你需要更多细节,建议参考 Matplotlib 官方文档


🟨设置各种标签

包括标题、轴标签、文本、点的注释、图例。

🔹标题:

通常:

python 复制代码
plt.plot(x, y)
plt.title("这是图表的标题")

或者:

python 复制代码
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title("这是图表的标题")

这是绘制子图的,fig代表整张图,ax代表这个子图(即Axes)。

标题是整张图或者子图的标题,所以Figure对象(.title())和Axes(.set_title())对象才能设置,前面提到的Line2D这样的对象是不能设置标题的。

可以使用 fig.suptitle() 方法为整个图形(包含多个子图)设置全局标题。

标题样式:

python 复制代码
plt.title("这是图表的标题", fontdict={'fontsize': 18, 'fontweight': 'bold', 'family': 'simsun', 'color': 'green'})

字体名称在电脑搜索栏搜索字体,点进去,就会看到字体,名称就是xxx.ttf。xxx就是这里要用的名称。

Matplotlib的默认字体是不能显示中文的,你不用在所有使用中文标签的函数中都单独设置一遍字体,可以设置一个全局字体,如:

python 复制代码
import matplotlib.pyplot as plt
import matplotlib as mpl

# 全局设置字体属性
mpl.rcParams['font.size'] = 14
mpl.rcParams['font.family'] = 'serif'
mpl.rcParams['font.weight'] = 'bold'

x = [1, 2, 3, 4]
y = [1, 4, 9, 16]

plt.plot(x, y)
plt.title("这是标题")
plt.show()

🔹轴标签:

和标题设置类似的,就是坐标轴起个名字。

使用 plt.xlabel()plt.ylabel()或者 ax.set_xlabel()ax.set_ylabel()

样式设置类似的。

🔹图例:

设置图例(legend)可以帮助识别不同的图形元素,如线条、点、柱状图等。

使用label+.legend()

python 复制代码
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y1 = [1, 4, 9, 16]
y2 = [1, 2, 3, 4]

plt.plot(x, y1, label='线条 1')
plt.plot(x, y2, label='线条 2')

# 添加图例
plt.legend()
plt.show()

或者使用一个列表传入:

python 复制代码
plt.legend(['Line1','Line2'])

若只显示特定对象的图例,比如只显示Line1和Line2:

python 复制代码
ax.legend(handles=[line1, line2], labels=['自定义线条 1', '自定义线条 2'])

Axes对象也是一样的方法。

图例的位置:upper left、upper right、lower left、lower right、upper center、lower center、center left、center right、center、best。

python 复制代码
ax.legend(loc='upper left')

可以通过 prop 参数设置字体大小和其他字体属性,通过 frameon 参数设置是否显示图例的边框,通过 shadow 参数设置图例的阴影效果。

python 复制代码
ax.legend(
    loc='upper right', 
    prop={'size': 14, 'weight': 'bold'},  # 字体属性
    frameon=False,  # 不显示边框
    shadow=True  # 显示阴影
)

🔹文本:

.text() 方法可以在图形的任意位置添加文本。需要指定文本的位置(x 和 y 坐标)和内容。

powershell 复制代码
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [1, 4, 9, 16]

plt.plot(x, y)
plt.text(2, 10, "这里是文本", fontsize=14, color='blue', fontweight='bold', style='italic')  # 设置文本属性
plt.show()

🔹注释:
.annotate() 方法不仅可以添加文本,还可以绘制箭头或其他标记来指示文本所指的位置。

python 复制代码
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

mpl.rcParams['font.family'] = 'simsun'

fig, ax = plt.subplots(figsize=(5, 2.7))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05))

ax.set_ylim(-2, 2)

plt.grid()
plt.show()

详细参数:https://matplotlib.org/stable/users/explain/text/annotations.html#plotting-guide-annotation

🔹文本中使用latex表示公式:

python 复制代码
ax.set_title(r'$\sigma_i=15$')

各种字母、数学符号的表示:https://matplotlib.org/stable/users/explain/quick_start.html#using-mathematical-expressions-in-text

🟨设置坐标轴

每个Axes都有2个(或3个)坐标轴。

🔹设置刻度比例:比如对数(log)、线性(linear)等

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

x = np.logspace(1, 10, 100)
y = x ** 2

fig, axs = plt.subplots(1, 2)

axs[0].plot(x, y, 'b-*')
axs[0].set_xscale('log')

axs[1].plot(x, y, 'r-o')
axs[1].set_yscale('log')

plt.show()

🔹设置坐标范围

  • plt.xlim(left, right) 用于设置 x 轴的范围,其中 left 是最小值,right 是最大值。
  • plt.ylim(bottom, top) 用于设置 y 轴的范围,其中 bottom 是最小值,top 是最大值。

🔹设置刻度和刻度标签标签

python 复制代码
import matplotlib.pyplot as plt

# 创建示例数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 17, 20]

# 创建图形和轴对象
fig, ax = plt.subplots()
ax.plot(x, y)

# 设置 x 轴和 y 轴的刻度
ax.set_xticks([1, 2, 3, 4, 5])  # 设置 x 轴的刻度位置
ax.set_yticks([10, 15, 20])     # 设置 y 轴的刻度位置

# 设置 x 轴和 y 轴的刻度标签
ax.set_xticklabels(['A', 'B', 'C', 'D', 'E'])  # 设置 x 轴的刻度标签
ax.set_yticklabels(['Low', 'Medium', 'High'])  # 设置 y 轴的刻度标签

# 显示图形
plt.show()

即在相应的位置显示刻度值,如果设置了刻度标签,就显示标签。

或者等距显示:

python 复制代码
# 设置 x 轴和 y 轴的刻度间隔
ax.xaxis.set_major_locator(MultipleLocator(2))  # x 轴每隔 2 显示一个刻度
ax.yaxis.set_major_locator(MultipleLocator(5))  # y 轴每隔 5 显示一个刻度

有时候每个刻度标签可能比较长,需要旋转一下文本方向:

python 复制代码
# 设置 x 轴和 y 轴的刻度标签方向
ax.tick_params(axis='x', labelrotation=45)  # x 轴刻度标签旋转 45 度
ax.tick_params(axis='y', labelrotation=90)  # y 轴刻度标签旋转 90 度

🔹设置双坐标轴:

双x轴同理。

python 复制代码
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.family'] = 'simsun'

# 创建示例数据
x = [1, 2, 3, 4, 5]
y1 = [10, 15, 13, 17, 20]
y2 = [80, 120, 150, 170, 200]

# 创建图形和主轴对象
fig, ax1 = plt.subplots()

# 绘制第一个 y 轴的数据
ax1.plot(x, y1, 'b-*', label='y1数据')
ax1.set_xlabel('X轴标签')
ax1.set_ylabel('Y1轴标签', color='g')
ax1.tick_params(axis='y', labelcolor='g')

# 创建第二个 y 轴,使用 twinx() 方法
ax2 = ax1.twinx()
ax2.plot(x, y2, 'r:o', label='y2数据')
ax2.set_ylabel('Y2轴标签', color='b')
ax2.tick_params(axis='y', labelcolor='b')

# 添加图例
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')

# 显示图形
plt.show()
🟨绘制子图

matplotlib 中,可以使用 .subplot.subplots 方法来绘制多个子图:

  • plt.subplot(nrows, ncols, index):

    • nrows: 子图的行数。
    • ncols: 子图的列数。
    • index: 当前子图的位置,从 1 开始(按行优先顺序)。
  • plt.subplots(nrows, ncols, figsize=(width, height)):

    • nrows: 子图的行数。
    • ncols: 子图的列数。
    • figsize: 图形的尺寸(宽度, 高度),以英寸为单位。
    • 返回 figaxs,其中 fig 是图形对象,axs 是一个包含所有子图的数组。

subplot 方法用于创建单个图形中的多个子图,按照指定的行列布局排列。你可以逐个创建子图并在上面绘制数据。

python 复制代码
import matplotlib.pyplot as plt

# 创建图形和子图
plt.figure(figsize=(10, 6))

# 第一个子图
plt.subplot(2, 2, 1)  # 2 行 2 列的网格中的第一个子图
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('子图 1')

# 第二个子图
plt.subplot(2, 2, 2)  # 2 行 2 列的网格中的第二个子图
plt.bar([1, 2, 3], [4, 5, 6])
plt.title('子图 2')

# 第三个子图
plt.subplot(2, 2, 3)  # 2 行 2 列的网格中的第三个子图
plt.scatter([1, 2, 3], [4, 5, 6])
plt.title('子图 3')

# 第四个子图
plt.subplot(2, 2, 4)  # 2 行 2 列的网格中的第四个子图
plt.hist([1, 2, 3, 4, 5])
plt.title('子图 4')

# 调整布局以避免重叠
plt.tight_layout()

# 显示图形
plt.show()

subplots 方法一次性创建多个子图,并返回一个包含所有子图的数组。这个方法适用于当你需要创建网格布局的子图时。

python 复制代码
import matplotlib.pyplot as plt

# 创建图形和子图
fig, axs = plt.subplots(2, 2, figsize=(10, 6))

# 第一个子图
axs[0, 0].plot([1, 2, 3], [4, 5, 6])
axs[0, 0].set_title('子图 1')

# 第二个子图
axs[0, 1].bar([1, 2, 3], [4, 5, 6])
axs[0, 1].set_title('子图 2')

# 第三个子图
axs[1, 0].scatter([1, 2, 3], [4, 5, 6])
axs[1, 0].set_title('子图 3')

# 第四个子图
axs[1, 1].hist([1, 2, 3, 4, 5])
axs[1, 1].set_title('子图 4')

# 调整布局以避免重叠
plt.tight_layout()

# 显示图形
plt.show()

subplot_mosaicmatplotlib 3.4.0 版本引入的一个功能,允许你通过定义一个网格布局的"马赛克"来创建子图。这种方法比传统的 subplot 方法更灵活,因为你可以使用字符串来定义布局,而不是指定行列数。

  • plt.subplot_mosaic(layout, figsize=(width, height)):

    • layout: 一个嵌套的列表,其中每个子列表表示一行,每个元素表示一个子图的标识符。相同的标识符表示共享同一个子图区域。
    • figsize: 图形的尺寸(宽度, 高度),以英寸为单位。
    • 返回 figaxs,其中 fig 是图形对象,axs 是一个字典,键是子图的标识符,值是对应的 Axes 对象。
  • 使用标识符:

    • layout 中,标识符是用来指定子图的位置和布局的。你可以根据需要自定义这些标识符,以适应复杂的布局需求。
python 复制代码
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.family'] = 'simsun'

# 使用 subplot_mosaic 创建子图布局
fig, axs = plt.subplot_mosaic(
    [
        ['A', 'B'],
        ['C', 'B'],
    ],
    figsize=(10, 8)
)

# 在子图 'A' 上绘制数据
axs['A'].plot([1, 2, 3], [4, 5, 6])
axs['A'].set_title('子图 A')
axs['A'].grid(which='both', linestyle='--', linewidth=0.5, color='c')

# 在子图 'B' 上绘制数据
axs['B'].bar([1, 2, 3], [4, 5, 6])
axs['B'].set_title('子图 B')
axs['B'].grid(which='both', linestyle=':', linewidth=0.5, color='y')

# 在子图 'C' 上绘制数据
axs['C'].scatter([1, 2, 3], [4, 5, 6])
axs['C'].set_title('子图 C')
axs['C'].grid(which='both', linestyle='-', linewidth=0.5, color='r')

# 调整布局以避免重叠
plt.tight_layout()
# 显示图形
plt.show()
🟨显示网格线
python 复制代码
plt.grid(which='both', linestyle='--', linewidth=0.5, color='gray')
参数 类型 默认值 说明
which str 'both' 指定要显示的网格线类型: - 'both':显示主网格线和次网格线 - 'major':显示主网格线 - 'minor':显示次网格线
axis str 'both' 指定要应用网格线的轴: - 'both':对 x 轴和 y 轴应用网格线 - 'x':仅对 x 轴应用网格线 - 'y':仅对 y 轴应用网格线
color str 'black' 网格线的颜色。可以是颜色名称、RGB 颜色值或十六进制颜色代码,如 'red''#FF5733'
linestyle str '-' 网格线的样式: - '-':实线 - '--':虚线 - ':':点线 - '-.':点划线
linewidth float 1.0 网格线的宽度,以磅为单位
🟨保存为图片

plt.savefig()matplotlib 中用于将当前图形保存到文件的方法。它可以保存为多种文件格式,包括 PNG、PDF、SVG、EPS 等。你可以使用 plt.savefig() 方法来保存图形以便后续查看、分享或嵌入到文档中。

python 复制代码
import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 17, 20]

# 创建图形和轴对象
plt.plot(x, y, marker='o')

# 添加标题和标签
plt.title('保存图形示例')
plt.xlabel('X 轴')
plt.ylabel('Y 轴')

# 保存图形到文件
plt.savefig('my_plot.png')  # 保存为 PNG 格式

# 显示图形
plt.show()
参数 类型 默认值 说明
fname str None 文件名或路径。支持相对路径和绝对路径,文件扩展名决定了保存的格式。
dpi int 100 图像的分辨率,以每英寸点数(DPI)为单位。较高的 DPI 值会产生更高质量的图像。
bbox_inches str 'tight' 设定边界框的大小。'tight' 自动调整边界框以适应图形内容。
pad_inches float 0.1 图像边界与内容之间的填充空间,以英寸为单位。
transparent bool False 如果为 True,背景将透明,适用于 PNG 格式。
quality int 95 图像质量,适用于 JPEG 格式,取值范围 1-100。
format str None 文件格式,如果 fname 参数中包含扩展名,则此参数可以省略。
facecolor str 'w' (white) 图像的背景颜色。'w' 表示白色,'none' 表示透明。
edgecolor str 'w' (white) 图像的边缘颜色。

前面通过折线图引入,介绍了Matplotlib绘图的各种常用基本操作。但仍然只是冰山一角,还有很多设置、特性没有展开说,感兴趣的部分去官网看文档即可。


3.12 散点图:scatter()

scatter()matplotlib 中用于绘制散点图的函数。散点图显示了两个变量之间的关系,通过将数据点在二维坐标系中标记出来。每个点的位置由其 x 和 y 坐标决定,点的颜色和大小也可以根据其他变量进行编码。

python 复制代码
import matplotlib.pyplot as plt

# 示例数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 17, 20]

# 创建散点图
plt.scatter(x, y)

# 添加标签和标题
plt.xlabel('X 轴')
plt.ylabel('Y 轴')
plt.title('散点图示例')

# 显示图形
plt.show()
  • x: x 轴的数据坐标。
  • y: y 轴的数据坐标。
  • s : 点的大小。可以是一个单一的数值,也可以是一个与 xy 长度相同的数组。
  • c: 点的颜色。可以是单一颜色,也可以是一个颜色数组,用于根据数据值设置颜色。
  • cmap : 如果 c 是一个数组,可以使用 cmap 指定颜色映射。常见的 colormap 包括 'viridis''plasma''inferno''magma'
  • alpha: 点的透明度,范围从 0(完全透明)到 1(完全不透明)。
  • marker : 点的形状,如 'o'(圆形)、's'(方形)、'^'(三角形)等。
  • edgecolor: 点的边缘颜色。
  • linewidths: 点的边缘线宽。

3.13 条形图:bar()

python 复制代码
import matplotlib.pyplot as plt

# 示例数据
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 25]

# 创建图形
plt.figure(figsize=(8, 6))

# 绘制条形图
plt.bar(categories, values)

# 添加标题和标签
plt.title('条形图示例')
plt.xlabel('类别')
plt.ylabel('值')

# 显示图形
plt.show()
参数 类型 默认值 说明
x array-like None 条形图的 x 轴数据,即类别或位置。
height array-like None 条形图的高度或长度。
width float 0.8 条形的宽度,默认为 0.8。如果绘制水平条形图,则为条形的高度。
align str 'center' 条形的对齐方式: - 'center':中心对齐 - 'edge':边缘对齐
color str, array-like None 条形的颜色,可以是颜色名称、RGB 颜色值、十六进制颜色代码或颜色列表。
edgecolor str 'black' 条形边缘的颜色。
linewidth float 1.0 条形边缘的宽度,以磅为单位。
tick_label array-like None 设置 x 轴刻度标签。
hatch str None 条形的填充样式,如 '/''\\'、`'

垂直条形图:bar()

水平条形图:barh()


太多了,先写这么多吧,官网都有教程的。

3.2 统计

3.21 直方图

3.22 箱线图

3.23 饼图

3.24 误差线

3.3 网格

3.4 不规则网格

3.5 3D和体积数据

相关推荐
WaaTong2 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng3 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的5 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ19 分钟前
C#语言:从入门到精通
开发语言·c#
云空27 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
童先生40 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu41 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv