目录
一、matplotlib简介
Matplotlib
是 Python
生态系统的一个重要组成部分,是用于可视化的绘图库,它提供了一整套和 matlab
相似的命令 API
和可视化界面,可以生成出版质量级别的精美图形,Matplotlib
使绘图变得非常简单,在易用性和性能间取得了优异的平衡。
安装成功后,即可以在 Python
中像使用其它库一样导入和使用 Matplotlib
,而无需更多文件的配置,通常我们将其导入后使用别名 mpl
:
import matplotlib as mpl
Matplotlib
的配置更多的用于修改绘制图形的默认样式,Matplotlib
的配置文件中包含了各种默认的图形配置信息,我们可以通过修改这些配置信息修改全局参数进行自定义所绘制图形的样式,这些参数可以改变图形尺寸、配色方案、字体等一系列信息。 可以使用多种方式完成 Matplotlib
的绘图配置,以下介绍三种配置方式通过配置文件
进行配置、通过 rcParams['param_name']
动态配置和通过 matplotlib.rc()
函数配置。
1.1 通过配置文件进行配置
配置文件同样可以分为几个不同的级别,如果我们希望修改所有的图形使用的默认配置,则需要修改全局默认配置;而如果我们需要根据不同任务使用不同的配置,或者不同用户使用不同的配置,则需要修改局部配置文件,以能够在不同的用户和任务中使用不同图形配置。根据配置文件的作用范围,可以分为三个级别:全局配置文件、用户级配置文件和当前任务配置文件。 不同系统三个级别的文件位于不同目录,可以通过使用以下代码,查看配置文件的路径:
import matplotlib as mpl
import os
# 全局配置目录
print(mpl.__path__)
# 当前用户配置目录
print(mpl.get_configdir())
# 当前任务配置目录,即当前代码运行目录
print(os.getcwd())
-
全局配置文件
mpl-data\matplotlibrc
,位于Matplotlib
的安装目录直线,例如在Window
下将其安装在D:\Program Files\Python39\lib\site-packages\matplotlib
目录下,则全局配置文件的完整文件名为D:\Program Files\Python39\lib\site-packages\matplotlib\mpl-data\matplotlibrc
,默认情况下,图形使用此配置文件进行绘制。 -
用户级配置文件
.matplotlib\matplotlibrc
,位于用户目录之下,例如,用户目录为C:\Users\Brainiac\
,则相应配置文件为C:\Users\Brainiac\.matplotlib\matplotlibc
;如果不存在此文件,也可以根据全局配置文件与用户需求自定创建和修改。 -
当前任务配置文件
matplotlibrc
,即位于代码运行目录之下,可以用于为当前任务的代码定制Matplotlib
配置,默认情况下不存在此文件,即默认使用全局或当前用户配置文件,我们可以根据需要创建此文件,并根据需要进行配置。
3.2 通过 rcParams[‘param_name’] 配置
如果仅仅想在当前文件中简单修改自定义配置,则可以通过 rcParams['param_name']
更快速的修改。通过使用以下代码,可以查看能够自定义配置的属性有哪些:
print(mpl.rc_params())
print(mpl.rcParamsDefault)
print(mpl.rcParams)
-
mpl.rc_params()
: 这个方法返回一个包含当前matplotlib运行时配置参数的字典。这些配置参数包括图形元素的默认颜色、线条样式、字体设置、坐标轴配置等等。通过查看这些参数,可以了解当前matplotlib的配置,以便更好地了解图形的绘制方式和样式设置。 -
mpl.rcParamsDefault
: 这个属性返回matplotlib的默认运行时配置参数。这些默认配置参数是在matplotlib库安装时预先设定的值。如果想恢复matplotlib的默认设置,可以使用这些默认参数进行重置。 -
mpl.rcParams
: 这个属性包含当前matplotlib的运行时配置参数,代表了当前的matplotlib配置。可以在运行时通过修改这些参数来自定义图形的显示和样式。例如,可以修改图形的默认颜色、线条样式、字体设置、坐标轴配置等等,以满足特定的需求和美学要求。
使用 rcParams['param_name']
方式修改配置的方式如下,其中 param_name
表示属性名:
示例:
mpl.rcParams['lines.linewidth'] = 2
# 修改线条颜色为红色
mpl.rcParams['lines.color'] = 'r'
在实际应用中,最常用的两种配置包括中文和中文负号的显示,如果不进行配置,默认不支持显示中文与中文负号:
#显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
#显示负号
mpl.rcParams['axes.unicode_minus']=False
3.3 通过 matplotlib.rc() 函数配置
同样我们也可以使用 matplotlib.rc()
函数进行配置,使用方法如下:
# 修改线宽
mpl.rc('lines', linewidth=2, color='g')
其中 rc
函数的第一个参数为 group
表示属性所属的组,用于限定属性的作用域,例如在以上示例中线宽 linewidth
属于线 lines
用于限定只在线条中起作用,而对坐标轴等线宽 linewidth
不起作用,如果想要修改包括坐标轴在内的图形线宽 linewidth
则需要使用:
# 修改整个图形线宽
mpl.rc('axes', linewidth=2)
二、matplotlib绘制简单图形
Matplotlib在图(Figure)(例如,窗口,Jupyter小部件等)上绘制数据,图可以包含一个或多个轴域(Axes)。
2.1 利用plt.subplots绘图
Axes是一个可以根据x-y坐标指定点的绘图区域(或极坐标图中的θ-r,3D图中的x-y-z等)。创建带有Axes的图的最简单方法是使用 pyplot.subplots。然后,可以使用Axes.plot在Axes上绘制一些数据:
例如:
x = np.arange(-10,11)
y = x**2 -2*x + 9
fig,ax = plt.subplots() # 创建一个图fig, 默认包含一个axes
ax.plot(x,y) # 绘制x-y的折线图
plt.show() # 显示绘制的图。请注意,如果使用save保存图片,需要在show前面保存
2.2 图(Figure)的结构
一幅图有下面这些部分:标题(Title)、图例(Legend)、x、y轴标签(xlabel、ylabel)等,示意图如下:
2.2.1 图 Figure
完整的图像。该图跟踪所有子轴域(Axes)—- 一组“特殊”画作(标题,图例,彩条等),甚至嵌套的子图。
创建新图的最简单方法是使用 pyplot:
fig = plt.figure() # 空图,没有Axes
fig, ax = plt.subplots() #有1个Axes
fig, axs = plt.subplots(2, 2) # 有2x2(两行两列) 个Axes
通常,将轴域(Axes)与 Figure 一起创建很方便,也可以在以后手动添加轴域。
2.2.2 轴域 Axes
轴域(Axes)是附加到图(Figure)上,包含用于绘制数据的图形。
通常包括两个轴(Axis)对象。两个轴分别提供刻度(ticks)和标签(tick label),以便为轴中的数据提供比例。每个轴域还有一个标题(通过 set_title())设置)、一个 x 标签(通过 set_xlabel()) 设置)和一个y 标签(通过 set_ylabel()) 设置)。
Axes 类及其成员函数是使用 OOP 接口的主要入口点,并且在其上定义了大多数绘图方法ax.plot()
2.2.3 轴 Axis
轴设置刻度(scale)和限制(limits)并且生成刻度(ticks,轴上的标记)和刻度标签(ticklabels,标记刻度的字符串)ticks位置由定位器(Locator)确定,ticklabel 字符串由格式器(Formatter)设置。正确的定位器(Locator)和格式器(Formatter)的组合可以对刻度位置和标签进行非常精细的控制。
2.2.4 Artist
rtist这里翻译成艺术家或画家。
基本上,图形上可见的所有内容都是艺术家(甚至是图形,轴域和轴对象)。这包括文本、Line2D 、集合、Patch等。渲染图形时,所有艺术家都将被绘制到画布上。大多数艺术家都与轴域关联;这样的艺术家不能由多个轴域共享,也不能从一个轴移动到另一个轴。
2.2.5 绘图函数的输入数据类型
绘图函数接收 numpy.array
或numpy.ma.masked_array
作为输入,或者是可以被传递给numpy.asarray
的数据。pandas数据或numpy.matrix
可能不会正常工作。常见的约定是在绘图前将数据转换成numpy.array
,示例:
b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b) # 使用np.asarray()将其转换成np.array类型
大多数方法还可以解析可寻址对象,如 dict
,np.recarray
或pandas.DataFrame
.
Matplotlib允许使用关键字参数生成图像,传递和x,y相应的字符串:
scatter方法通常是由数据可视化库(如Matplotlib或Seaborn)提供的一个函数,用于绘制散点图:
Matplotlib中scatter方法的参数和用法:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None)
参数解释:
-
x
:横坐标数据,是一个数组或Series,用于表示散点图中每个点的横坐标位置。 -
y
:纵坐标数据,是一个数组或Series,用于表示散点图中每个点的纵坐标位置。 -
s
:点的大小,可以是一个数值或数组,控制散点的大小。默认值为None
,表示使用默认点大小。 -
c
:点的颜色,可以是一个颜色字符串、颜色列表或数组,用于控制散点的颜色。默认值为None
,表示使用默认颜色。 -
marker
:点的标记样式,可以是一个标记字符串,例如 ‘o’ 表示圆点,’s’ 表示方块等。默认值为None
,表示使用默认标记样式。 -
cmap
:用于指定颜色映射的Colormap对象或字符串。它在指定c参数为数值时使用,将数值映射到颜色空间。默认值为None
,表示使用默认颜色映射。 -
norm
:用于归一化数据的Normalize对象。它在指定c参数为数值时使用。默认值为None
,表示使用默认的归一化方式。 -
vmin
和vmax
:用于设置颜色映射范围的最小值和最大值。它们在指定c参数为数值时使用。默认值为None
,表示使用数据的最小值和最大值作为范围。 -
alpha
:点的透明度,取值范围为 [0, 1],其中 0 表示完全透明,1 表示完全不透明。默认值为None
,表示使用默认透明度。 -
linewidths
:点边界的宽度,用于控制点的边界线宽度。默认值为None
,表示使用默认线宽。 -
edgecolors
:点边界的颜色,用于控制点的边界线颜色。默认值为None
,表示使用默认颜色。
示例:
np.random.seed(19680801) # 伪随机数
data = {'a': np.arange(50),
'c': np.random.randint(0, 50, 50),
'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100
fig, axes = plt.subplots(2,1) # fig 拥有2行1列个子图,存放在axes数组(np.array类型)中。
print(axes)
ax = axes[0]
ax.scatter('a', 'b', c='c', s='d', data=data)
ax.set_xlabel('entry a')
ax.set_ylabel('entry b')
# 轴域2 ,去掉颜色c,形状s参数。
ax2 = axes[1]
ax2.scatter('a', 'b', data=data)
plt.show()
ax.scatter(‘a’, ‘b’, c=’c’, s=’d’, data=data)表示如下:
-
‘a’, ‘b’`:这是横轴和纵轴的数据。’a’表示横轴数据,’b’表示纵轴数据。在这个例子中,’a’和’b’都是包含50个数据点的numpy数组,用于绘制散点图的横坐标和纵坐标。
-
c='c'
:这是设置散点的颜色参数。在这里,’c’代表颜色,意味着每个散点的颜色将由data['c']
中的数据决定。data['c']
是一个包含50个随机整数的numpy数组,它将为每个数据点指定颜色。 -
s='d'
:这是设置散点的大小参数。在这里,’d’代表大小,意味着每个散点的大小将由data['d']
中的数据决定。data['d']
是一个包含50个随机浮点数的numpy数组,它将为每个数据点指定大小。 -
data=data
:这个参数告诉scatter
函数,要从data
字典中获取’x’和’y’轴的数据(即’a’和’b’),以及颜色和大小参数(’c’和’d’)。
2.2.6 编码风格 Coding Styles,面向对象(OO)和pyplot函数接口
基本上有两种使用 Matplotlib 的方法:
-
显式创建“图形(Figures)”和“轴域(Axes)”,并在其上调用方法(“面向对象 (OO) 样式”)。
-
依靠 pyplot 自动创建和管理图形和轴,并使用 pyplot 函数进行绘图。
使用OO样式,觉得OO样式比较好,只需要在轴域(Axes)对象上设置就可以,非常清晰,示例:
plt.subplots()
是Matplotlib库中用于创建子图(subplot)的函数。它可以一次性创建一个包含多个子图的图形,并将这些子图存储在一个NumPy数组(np.array类型)中,使得对多个子图进行管理和操作更加方便。
plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
-
nrows
:表示子图的行数,即图中有几行子图。 -
ncols
:表示子图的列数,即图中有几列子图。 -
sharex
:如果设置为True,则所有子图将共享相同的x轴(即横坐标)。默认值为False,即每个子图都有独立的x轴。 -
sharey
:如果设置为True,则所有子图将共享相同的y轴(即纵坐标)。默认值为False,即每个子图都有独立的y轴。 -
squeeze
:如果设置为True,则当行数或列数为1时,返回的子图数组将是压缩的。如果设置为False,则无论行数和列数是多少,返回的子图数组都是二维数组。默认值为True。 -
subplot_kw
:是一个字典,用于传递给每个子图的配置参数。例如,您可以使用该参数设置标题、轴标签等属性。 -
gridspec_kw
:是一个字典,用于传递给GridSpec
对象的配置参数。GridSpec
用于更灵活地排列子图,可以用于创建非规则的子图布局。 -
**fig_kw
:这里的fig_kw
是传递给plt.figure()
的其他关键字参数。plt.figure()
是创建图形的函数,您可以使用fig_kw
参数来设置图形的属性,例如图形大小、标题等。
x = np.linspace(0, 2, 100) # 产生一些数据
# 使用OO风格,先产生两个对象 图和轴域 (fig, ax)
fig, ax = plt.subplots(figsize=(5, 5), layout='constrained')
# 调用ax对象的方法
ax.plot(x, x, label='linear') # Plot some data on the axes. 绘制线性曲线,并给曲线添加标签'线性'
ax.plot(x, x**2, label='quadratic') # Plot more data on the axes...绘制二次方曲线,并给曲线添加标签'二次方'
ax.plot(x, x**3, label='cubic') # ... and some more. 绘制三次方曲线,并给曲线添加标签'三次方'
ax.set_xlabel('x label') # Add an x-label to the axes.
ax.set_ylabel('y label') # Add a y-label to the axes.
ax.set_title("Simple Plot") # Add a title to the axes. 添加轴域对象标题
ax.legend() # Add a legend. 添加图例,用于显示每条曲线对应的标签
plt.show()
在这段代码中,fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
是用Matplotlib创建图形和子图的语句。让我来解释每个参数的含义:
-
figsize=(5, 2.7)
:这是用于设置图形大小的参数。figsize
是一个元组,包含两个元素,分别表示图形的宽度和高度(单位是英寸)。在这里,设置图形的宽度为5英寸,高度为2.7英寸。 -
layout='constrained'
:这是一个非常特殊的参数,它在Matplotlib中没有直接定义的意义。实际上,这个参数并不是Matplotlib中的标准参数,所以在这个具体的代码片段中,layout='constrained'
可能不会被正确地解释或产生预期的效果。
在Matplotlib中,plt.subplots()
函数的layout
参数并不存在。plt.subplots()
函数的参数中,并没有名为layout
的参数。如果要控制子图的布局和排列方式,可以使用plt.subplot()
或plt.GridSpec()
等其他函数进行更高级的子图定位和布局设置。
使用pyplot函数风格:
x = np.linspace(0, 2, 100) # 产生一些数据
plt.figure(figsize=(5, 5), layout='constrained')
plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic') # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
plt.show()
文章出处登录后可见!