文章目录
- 一、简介
- 二、一些基本概念
-
- [2.1 图表元素](#2.1 图表元素)
- [2.2 常见图表类型](#2.2 常见图表类型)
- [2.3 主要绘图函数及其返回值](#2.3 主要绘图函数及其返回值)
- [2.4 Artists 的概念](#2.4 Artists 的概念)
- 三、基本图表详解
-
- [3.1 成对数据](#3.1 成对数据)
- [3.2 统计](#3.2 统计)
-
- [3.21 直方图](#3.21 直方图)
- [3.22 箱线图](#3.22 箱线图)
- [3.23 饼图](#3.23 饼图)
- [3.24 误差线](#3.24 误差线)
- [3.3 网格](#3.3 网格)
- [3.4 不规则网格](#3.4 不规则网格)
- [3.5 3D和体积数据](#3.5 3D和体积数据)
一、简介
Matplotlib 是一个用于创建静态、动态和交互式图表的 Python 绘图库。它提供了大量的图表类型和工具,适用于数据分析和可视化。
Matplotlib是Python语言及其数值计算库NumPy的绘图库。它提供了一个面向对象的API,可以将绘图嵌入到使用通用GUI工具包(如Tkinter、wxPython、Qt或GTK)的程序中。它还有一个基于状态机(就像OpenGL)的过程式编程"pylab"接口,其设计与MATLAB非常类似。
Matplotlib文档:https://matplotlib.org/stable/index.html
核心特性:
-
丰富的图表类型:
- 线图、散点图、条形图、饼图、直方图等。
- 高级图表如等高线图、3D 图表、热力图等。
-
高度自定义:
- 图形的各种属性(如颜色、线型、标记、标签等)可以自定义。
- 可以添加标题、标签、图例、网格等。
-
兼容性强:
- 支持多种输出格式,包括 PNG、PDF、SVG、EPS 等。
- 与 NumPy 和 Pandas 等库紧密集成,方便数据处理和分析。
-
交互性:
- 支持交互式绘图,能够响应用户操作。
- 与 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() |
字典 | 绘制箱线图,返回一个包含多个 Line2D 和 Patch 对象的字典 |
pie() |
列表 | 绘制饼图,返回 Wedge 对象的列表 |
imshow() |
AxesImage 对象 |
显示图像数据,返回一个 AxesImage 对象 |
contour() |
QuadContourSet 对象 |
绘制等高线图,返回一个 QuadContourSet 对象 |
contourf() |
QuadContourSet 对象 |
绘制填充等高线图,返回一个 QuadContourSet 对象 |
pcolormesh() |
QuadMesh 对象 |
绘制伪彩色图,返回一个 QuadMesh 对象 |
errorbar() |
ErrorbarContainer 对象 |
绘制带误差条的图,返回一个 ErrorbarContainer 对象 |
2.4 Artists 的概念
在 Matplotlib 中,"Artists" 是一个广泛使用的概念,它指的是图形元素的抽象表示
。所有在图形上绘制的内容都是一个 Artist
对象,包括但不限于图形、文本、标签、图例等。
Artists
可以分为以下几类:
-
基本元素 (Primitive Elements):
- 这些是最基本的图形元素,例如
Line2D
、Rectangle
、Circle
、Text
等。
- 这些是最基本的图形元素,例如
-
容器 (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 数组等。x
和 y
的长度必须相同。没数据就画不出图了。
🟢可选参数:主要用来设置图表的样式:如线条样式、轴标签、轴取值等等。
🟢函数返回值: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
: 图形的尺寸(宽度, 高度),以英寸为单位。- 返回
fig
和axs
,其中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_mosaic
是 matplotlib
3.4.0 版本引入的一个功能,允许你通过定义一个网格布局的"马赛克"来创建子图。这种方法比传统的 subplot
方法更灵活,因为你可以使用字符串来定义布局,而不是指定行列数。
-
plt.subplot_mosaic(layout, figsize=(width, height))
:layout
: 一个嵌套的列表,其中每个子列表表示一行,每个元素表示一个子图的标识符。相同的标识符表示共享同一个子图区域。figsize
: 图形的尺寸(宽度, 高度),以英寸为单位。- 返回
fig
和axs
,其中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
: 点的大小。可以是一个单一的数值,也可以是一个与x
和y
长度相同的数组。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()
太多了,先写这么多吧,官网都有教程的。