Python学习笔记(11-3):matplotlib绘图——图片属性设置函数
文章导读
- 课程难度:★★★☆☆
- 重要度:★★★★★
- 预计学习时间:1.5小时
- 简介:本节主要是对于图形属性设置函数的讲解,以此达到美化图像、增强图像信息可读性的效果,内容包括:(1)坐标轴的基础设置、高级设置以及基于tick_params修改坐标轴参数的设置;(2)基于图例参数、文本信息以及图像边框等辅助信息的设置;(3)基于调节子图范围、设置背景色等方法设置图像主题风格。
- 重点涉及的函数和内容:set_xlim()、set_ylim()、set_xlabel(),set_ylabel()、set_title ()、axis.set_ticks_position()、axis.set_label_text () 、plt.setp()、ax.tick_params()、ax.text()、ax.annotate()、set_facecolor();
利用函数plt.tight_layout()解决图像和图像的标签互相交叠的问题;利用函数plt.style.use()设置主题风格。
一、坐标轴参数设置
1、坐标轴基础设置
首先我们讲解坐标轴标度设置,这里包括两部分,分别是坐标轴的范围和名称设置。
(1)坐标轴范围的设置函数,包括如下几组:
函数名 | 函数含义 |
---|---|
set_xlim(),set_ylim() | 先后传入左值和右值,可以将其中一个值置为None表示让程序自动选择标度。这个函数在同时传入左值和右值,且左值大于右值时,会默认执行一次轴反转。 |
set_xbound(),set_ybound() | 先后传入左值和右值,可以将其中一个值置为None表示让程序自动选择标度。这个函数会保持左小右大的轴向,无视传入左值和右值的大小关系。 |
invert_xaxis(),invert_yaxis() | 使轴向倒置,即将图的x轴、y轴左右颠倒。 |
set_xscale(),set_yscale() | 设置轴的标度形式(连续数字、对数)。可从’linear’、‘log’、‘symlog’、'logit’中选择,绘图数据的范围要满足轴标度要求,例如log下一个轴的所有数值不能小于等于0 |
这里,我们利用一个函数对这个上述函数进行简明的综合讲解:
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1)
ax.plot(x, y2)
ax.set_xlim(3.5, 0.5) # 设置x轴坐标范围,会倒置x轴
ax.set_ybound(9.5, 0.5) # 设置y轴坐标范围,不会倒置y轴
ax.invert_xaxis() # 将x轴倒置
ax.invert_yaxis() # 将y轴倒置
ax.set_xscale('linear') # 将x轴设置为线性轴(一般的轴)
ax.set_yscale('log') # 将y轴设置为对数轴
plt.show()
输出图像如下。请注意,x轴因为set_xlim()
函数的缘故被倒置了,而后又被invert_xaxis()
函数而倒置回来,而y轴由于设置范围时调用的是set_ybound()
函数,当时并没有修改其轴向。同时,因为set_yscale()
函数的缘故,y轴最终被设置为对数取值。
(2)坐标轴名称设置函数,包含如下几个方法:
函数名 | 函数含义 |
---|---|
set_xlabel(),set_ylabel() | 设置x和y轴的标题,可接收labelpad、fontsize与color参数,分别指示标题相对图边缘移动的距离、轴标题的字号和轴标题的颜色。此外,还有一个bbox参数,允许在轴标题外绘制一个方框。 |
set_title () | 设置图像的标题,可接收pad、fontsize与color参数,分别指示标题相对图边缘移动的距离、轴标题的字号和轴标题的颜色。 |
plt.grid() | 当设置为True时,指示绘制x和y的网格线。这个放在这里,作为基础坐标轴设置的补充。它是类函数而不是ax的成员函数。 |
对于上述三个函数,允许给出bbox
参数指示是否为轴的名字设置一个边框,但这里较为复杂,请参考例子和开发文档的说明[ 请参考:官方文档1、官方文档2]。
对于输出的文本的字体、字号(例如这里的fontsize
)、颜色等,其所有可用的参数来源于Text模块[ 请参考:设置文本Text属性的官方文档],所需的参数可从Text模块找:
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
box = dict(facecolor='yellow', pad=5, alpha=0.2) # 设置box传递给函数的bbox参数
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable', labelpad = 30, fontsize = 10, color = 'g', bbox = box)
ax.set_ylabel('Dependent variable', labelpad = 30, fontsize = 10, color = 'r', bbox = box)
ax.set_title('x-y plot', pad = 40, fontsize = 20, color = 'b', bbox = box)
plt.grid(True)
plt.show()
输出图像如下:
2、坐标轴高级设置
接下来讲解的是针对轴上各种细节对象,例如刻度、刻度值等部分的调整。对于这些更为细节的部分,我们不是直接访问axe
对象,而是访问axe
对象下面的Axis
元素来处理。
我们首先描述两组访问轴和访问刻度的函数。请注意如下两组方法使用的是不同对象的成员函数。获得axis
对象是通过axe
对象,获得tick
对象是通过axis
对象(axis
为坐标轴、label
为标题、tick
为刻度对象、ticklabel
为刻度值(或刻度标签,即刻度对的数字),tick
对象下的tick
属性是刻度的线(齿),而label
则是刻度的标签文本):
函数名 | 函数含义 |
---|---|
ax.get_xaxis(),ax.get_yaxis() | 通过axe,获取x轴和y轴的坐标轴对象,记为axis |
axis.get_major_ticks() | 通过axis,获取当前坐标轴的刻度对象,记为ticks。此处请注意,这里的ticks实际上是一个由整个坐标轴所有刻度组成的列表,例如一个轴有10个刻度,则这里的ticks是长度为10的列表,每个元素都是一个单独的刻度对象,可以单独修改。 |
axis.get_ticklabels() | 通过axis,获取当前坐标轴的所有刻度对象,返回的是Text对象构成的列表。我们可以进而通过对这些对象进行访问(如plt.setp()函数)以修改他们 |
我们这里先编写基础的代码,先获取到当前x轴和y轴的axis
对象与tick
对象,之后再对其各自支持的许多功能进行一一讲解。之后的代码都需要与下面的代码一同运行:
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable')
ax.set_ylabel('Dependent variable')
xaxis = ax.get_xaxis()
yaxis = ax.get_yaxis()
xticks = xaxis.get_major_ticks()
yticks = yaxis.get_major_ticks()
在此,有如下处理坐标轴其标题和刻度位置的方法汇总如下:
函数名 | 函数含义 |
---|---|
axis.set_label_position() | 设置x轴和y轴标题的位置。对于x可选’top’和’bottom’,对于y可选’left’和’right’。 |
axis.set_label_text () | 设置轴标题的文本,会覆盖掉之前定义的标签值 |
axis.tick_top(),axis.tick_bottom() | 将x轴的刻度和刻度文本设置在上方、下方。 |
axis.tick_left(),axis.tick_right() | 将y轴的刻度和刻度文本设置在左侧、右侧 |
axis.set_ticks_position() | 另一种设置x轴和y轴的刻度和刻度值的方式。对于x轴,支持’top’, ‘bottom’、‘both’、‘none’选项,对于y轴,支持’left’、‘right’、‘both’、'none’选项,便于设置无刻度或双侧刻度。这里传入’both’时,只会在原有标度的对侧增加一个刻度,不会将标度文本也转移过去 |
axis.set_major_formatter() | 设置刻度值的输出格式,需要传递一个格式参数,该格式参数由matplotlib.ticker包下的函数FormatStrFormatter()建立,该函数需传递一个格式化字符串参数。 |
下面是刻度常用的参数:
属性/函数名 | 属性函数含义 |
---|---|
tick.set_pad() | 设置刻度的偏移量,默认从当前位置向外偏移 |
tick.gridOn | 设置刻度的网格线是否显示。 |
tick.tick1On,tick.tick2On | 设置x轴下方/上方(或y轴左侧/右侧)的刻度线是否显示。 |
tick.label1On,tick.label2On | 设置x轴下方/上方(或y轴左侧/右侧)的刻度标签是否显示。 |
tick.tick1line.set_color(),tick.tick2line.set_color() | 设置各个刻度的各个竖线(齿)的颜色 |
tick.label1.set_color(),tick.label2.set_color() | 设置各个刻度文本(标签)的颜色 |
最后,我们补充讲解一个函数,plt.setp()
[ 请参考:setp()函数官方文档]。这个函数实际上是一个通用的设置对象属性的函数,它接收一个对象,并可以修改这个对象所有支持的属性。例如,我们在本节的最初提到了get_ticklabels()
,它以Text对象返回了所有刻度的值文本。
因此可以利用这个函数对所有刻度值文本修改所有Text对象能支持的属性,例如刻度值的旋转和对齐方式。我们在这里讲解这个函数,是用来修改其旋转角度和对齐方式:
属性/函数名 | 属性函数含义 |
---|---|
obj | 指示待设置的刻度对象 |
rotation | 刻度标签的旋转角度(正方向为逆时针),支持负数即向顺时针旋转。 |
ha(horizontalalignment) | 指示字符串的中间、右边、左边与刻度对齐,可选 ‘center’, ‘right’, ‘left’。 |
我们对上面的函数进行调用,此处的代码要接着此前的代码继续执行:
# 设置x和y轴标题的位置
xaxis.set_label_position('top') # 将x轴标题设置在上方
yaxis.set_label_position('right') # 将y轴标题设置在右侧
xaxis.set_label_text('IV') # 设置x轴标题
yaxis.set_label_text('DV') # 设置y轴标题
# 设置x和y轴的刻度和刻度值的位置
xaxis.tick_top() # 将x轴的标度设置在顶端
yaxis.tick_left() # 将y轴的标度设置在左端
yaxis.set_ticks_position('none') # 设置标度现实的位置,none
xaxis.set_ticks_position('none') # 设置标度值,
# 设置标度的输出格式,这里以三位小数为例:
# 这里需要引入matplotlib.ticker包进行字符串格式对象的设置
import matplotlib.ticker as ticker
formatter = ticker.FormatStrFormatter('%1.3f')
yaxis.set_major_formatter(formatter)
xaxis.set_major_formatter(formatter)
# 设置轴刻度的显示与否和偏移量,这里用之前访问得到的xtick实例来实现。
for tick in xticks:
tick.set_pad(20) # 设置刻度文本的偏移量
tick.gridOn = True # 绘制x刻度的网格线
tick.tick1On = False # 下方刻度线不显示、上方显示
tick.tick2On = True
tick.label1On = False # 下方刻度文本不显示、上方显示
tick.label2On = True
tick.tick2line.set_color('green') # 将刻度设置为绿色
tick.label2.set_color('green') # 将标签设置为绿色
# 设置标尺字符的旋转和对齐方式
plt.setp(ax.get_xticklabels(), # 获取x轴的刻度标签
rotation = 45, # 设置旋转角度为45度
ha = 'left', # 设置刻度文本的左边与刻度对齐
)
plt.show()
输出图像如下:
3、基于tick_params的坐标轴参数修改
tick_params
是设置坐标轴的语法,tick_params
的语法很简单,这里的Axes
就是ax
:
Axes.tick_params(axis='both', **kwargs)
对于本函数,常常用于修改的参数如下:
参数名称 | 参数含义 |
---|---|
axis | 可选’x’、‘y’、‘both’,分别代表设置X轴、Y轴以及同时设置,默认值为’both’。设置为’x’时对左右参数的设置无效,设置为’y’时则上下无效 |
which | 可选’major’,‘minor’,‘both’,分别代表设置主刻度线、副刻度线以及同时设置。 |
direction | 可选’in’,‘out’,‘both’,分别代表刻度线显示在绘图区内侧、外侧以及同时显示 |
width | 指示刻度线的宽度和长度。 |
pad | 指示刻度线与标签间的距离。 |
labelsize | 指示标签的大小,例如’medium’、'large’等,也可以传递浮点型数字作为大小。 |
bottom,top | 分别指示刻度线是否在图的上方或下方显示,受axis的影响 |
left,right | 分别指示刻度线是否在图的左侧或右侧显示,受axis的影响 |
labelbottom,labeltop | 分别指示刻度文本是否在上方或下方显示,受axis的影响 |
labelleft,labelright | 分别指示刻度文本是否在图的上方或下方显示,受axis的影响。 |
color | 指示刻度线的颜色 |
labelcolor | 指示刻度文本的颜色 |
colors | 同时指示刻度线和刻度文本的颜色。 |
ax.tick_params()
函数可多次调用,每次设置会覆盖掉之前重复的设置。例如我们这边先后对x和y的列进行各自设置,调用两次该函数并传入不同的参数即可。
在此,我们利用此前的数据,演示各个参数的实际效果:
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable')
ax.set_ylabel('Dependent variable')
ax.tick_params(axis = 'x', # 设置x轴
which = 'major', # 设置主刻度线
direction = 'out', # 刻度线显示在绘图区外侧
width = 2, length = 5, # 指示刻度线的宽度和长度
pad = 10, # 指示刻度文本的位移
labelsize = 'medium', # 指示标签的大小,也可以传递浮点型数字
bottom = True, top = False, # 指示刻度线在图上方显示、下方不显示
left = True, right = True, # 指示刻度线在图左侧和右侧显示
# 现在因为指示x轴,故两参数无效
labelbottom = False, # 指示刻度文本不在图的下方显示
labeltop = True, # 指示刻度文本在图的上方显示
colors='gold' # 指示刻度线和文本的颜色
)
#对y的设置就相对简单,只用来做一个相应的比较。
ax.tick_params(axis = 'y', which = 'major',direction = 'out', colors='b')
plt.show()
输出图像如下:
二、辅助信息设置
辅助信息,其含义是辅助图片做信息描述的其他元素。这里讲解两个部分,一是图例,二是文本。
1、图例参数设置:.legend()
图例信息我们实际上就是利用此前已经利用过的legend()
函数。这个函数我们只需要额外讲解一个参数即可,即loc
,它指示图例的摆放位置,其编码和具体含义如下:
location string | location code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
‘center right’ | 7 |
‘lower center’ | 8 |
‘upper center’ | 9 |
‘center’ | 10 |
我们尝试绘制这两根曲线的图例: |
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.legend(title = 'LEGEND', loc = 4) # 将曲线图例放在右下方,标题为LEGEND
plt.show()
输出图像如下:
2、文本信息设置
关于在图片中嵌入文本信息,这里讲两个函数,第一种是text,第二种是annotate。
(1)ax.text()
嵌入一串文本用ax.text()
函数,它可以在画布上的任何位置输出对应的文本,可指示的参数如下。包括fontsize
、color
在内的其他可选参数参照Text类下的参数:
参数名称 | 参数含义 |
---|---|
x, y | 输出文本的位置,位置以图片的坐标位置给出(而不是相对位置等) |
s | 输出的字符串 |
fontsize | 文本的字号 |
color | 文本的颜色 |
(2)ax.annotate()
嵌入一个注释用ax.annotate()
函数,注释是指对某个具体的位置附带的说明、换言之,它有两个坐标,一是被注释位置的位置,二是注释文本的位置。这个函数需要同时上述给出两个坐标,和指向箭头的形状设计参数。它的主要参数如下:
参数名称 | 参数含义 |
---|---|
s | 输出的字符串 |
xy | 元组形式,指示被注释对象的位置,即注释箭头的终点位置 |
xytext | 元组形式,指示注释文本的位置,即注释箭头的起点位置 |
arrowprops | 箭头的形式,都是传递一个字典,但第一种是对各种参数手工定义,第二种是传递一个表征箭头形状的arrowstyle文本 |
fontsize | 文本的字号,文本形式的参数全部使用Text类下的参数 |
color | 文本的颜色 |
下面展示了ax.annotate()
函数下arrowprops
参数的两种传递方法,但当然,每次调用时仅能传递其中的一个:
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure()
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.text(x = 1, y = 8, # 文本输出的位置坐标
s = 'y = x ** 2 and y = x * 2 + 1', # 待输出的字符串
fontsize = 12, # 文本的字号
color = 'g' # 文本的颜色
)
ax.annotate('cross point', # 指示注释的文本信息
xy = (2.4, 5.6), # 指示注释箭头的终点位置,
# 位置以图片的坐标位置给出
xytext = (2.8, 2), # 指示注释箭头的起点位置,
# 位置以图片的坐标位置给出
# arrowprops第一种对所有参数全部手工定义
arrowprops = dict(facecolor = 'black', # 箭头的颜色
width = 4, # 箭头中段的宽度
headwidth = 6, # 箭头头部的宽度
shrink = 0.05, # 箭头相比头尾缩短的距离
),
# 第二种是直接传递一个arrowstyle,此时不传递其他参数
#arrowprops = dict(facecolor = 'black', # 箭头的颜色
# arrowstyle = '->' # 箭头风格的arrowstyle
# )
)
plt.show()
图像在两种arrowprops
参数下的输出结果分别如下:
下面继续举一个绘制热力图的例子:
# 定义列名、行名和数据
vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
"potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
"Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]
harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])
# 绘制基础热力图
plt.figure(figsize = (6, 6))
fig, ax = plt.gcf(), plt.gca()
im = ax.imshow(harvest)
# 设置x、y轴参数以及标签文本的旋转
ax.set_xticks(np.arange(len(farmers)))
ax.set_yticks(np.arange(len(vegetables)))
ax.set_xticklabels(farmers)
ax.set_yticklabels(vegetables)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")
# 最后,循环所有行列,将文本进行嵌入。
for i in range(len(vegetables)):
for j in range(len(farmers)):
text = ax.text(j, i, harvest[i, j],ha="center", va="center", color="w")
ax.set_title("Harvest of local farmers (in tons/year)")
fig.tight_layout()
plt.show()
输出图像如下:
3、图像边框设置:ax.spines[ ]
图像边框通过访问axe
的属性获得。
首先,我们通过ax
的spines
属性访问图像的属性,其上下左右的框线对象分别通过ax.spines
的'top'
、'bottom'
、'left'
、'right'
属性进行访问:
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure(figsize = (6, 6), dpi = 100)
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable')
ax.set_ylabel('Dependent variable')
# 访问一个图像上下左右的框线
tspine, bspine = ax.spines['top'], ax.spines['bottom']
lspine, rspine = ax.spines['left'], ax.spines['right']
下面是框线的成员函数:
函数名称 | 函数作用 |
---|---|
set_color() | 设置框线的颜色,设置为’none’时表示框线没有颜色 |
set_bounds() | 设置框线绘制的值域,只绘制值域范围内的框线 |
set_position() | 设置框线的位置,它都接收一个元组,包含一个指示移动方式的字符串和一个浮点型参数,它包括三种方式。 |
对于set_position()
所指示的三种传递参数的方式,在此汇总如下:
1、('outward', n):指示一个轴向图片的外侧移动n个像素位置,例如对左边框,代表向左偏移n个像素,n为负值表示向内侧移动。
2、('axes', n):指示一个轴向图片的内侧移动另一个轴刻度(注意是刻度)长度的n倍,例如对左边框,代表指示其向右移动到刻度的n倍的位置。例如n为0.5时,表示将左边框移动到横边刻度的中央。它也可以接收负数代表向反方向移动。
3、('data', n):指示一个轴移动到另一个刻度对应刻度为n的值的位置。例如n为0时,将这个轴移动到另一轴刻度为0的值的位置。
对于传递('axes', 0.5)
和('data', 0)
,可以直接传递字符串'center'
和'zero'
替代;
我们综合运用上面的三个函数绘制一个调整了框线的图像,接着上面的代码继续执行:
# 利用set_color()函数修改框线的颜色
lspine.set_color('green') # 左框线设置为绿色
bspine.set_color('green') # 下框线设置为绿色
rspine.set_color('none') # 右框线设置为无色
tspine.set_color('none') # 上狂下设置为无色
# 利用set_bounds()函数修改框线的绘制范围
bspine.set_bounds(-1, 4) # 将底边绘制的值域改成-1至4
lspine.set_bounds(-1, 10) # 将左边绘制的值域改成-1至10
# 利用set_position()函数修改框线位置,前三行不执行
# lspine.set_position(('outward',100)) # 向外移动左框100个像素
# lspine.set_position(('axes', 0.5)) # 移动左框至横边刻度中点,等同于'center'
# lspine.set_position(('data', 0)) # 移动左框至横边刻度为0,等同于'center'
lspine.set_position('zero') # 将左边框移位到横边为0的位置
bspine.set_position('zero') # 将底边框移位到竖边为0的位置
plt.show()
输出图像如下:
三、图片风格参数设置
1、子图范围的调节
当我们在一个画布画多个子图的时候,经常会遇上子图之间标题和图表相冲突,字被打印在了图上的情况。而使用一个plt.tight_layout()
便可以解决这个问题,这个函数能将图本身缩小,使图像和轴即图片的标签互相不会交叠。这个函数一般而言不需要再修改内置参数。
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
y3 = np.sin(x * np.pi)
y4 = np.cos(x * np.pi)
fig, axs = plt.subplots(2, 2, figsize = (8, 6))
ax0, ax1, ax2, ax3 = axs[0][0], axs[0][1], axs[1][0], axs[1][1]
axs[0][0].plot(x, y1, label = 'y = x ** 2')
axs[0][1].plot(x, y2, label = 'y = x * 2 + 1')
axs[1][0].plot(x, y3, label = 'y = sin(x)')
axs[1][1].plot(x, y4, label = 'y = cos(x)')
for ax in (ax0, ax1, ax2, ax3):
ax.set_xlabel('x-label', fontsize = 12)
ax.set_ylabel('y-label', fontsize = 12)
ax.set_title('Title', fontsize = 12)
plt.tight_layout() # 可比较该函数执行与否的图像输出结果
plt.show()
输出图像如下。上下两图分别是plt.tight_layout()
不执行与执行时的输出效果。比较输出结果我们可以发现,这个函数可以将图片区域缩小,不让文本与图像或文本之间产生交叠而显得拥挤。这个函数在对输出结果图像的修饰中很实用
2、背景色设置
设置一个背景色有如下几种方式:
方法1:利用set_facecolor()函数
这个函数对于画布和图片均适用。利用gcf
,gca
函数访问画布和图像的对象,接着可以分别用自己的set_facecolor()
函数定义画布和图片区域的单色背景。
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
width, height, dpi = 8, 6, 100
fig, ax = plt.subplots(1, 1, figsize = (width, height), dpi = dpi)
fig = plt.gcf()
fig.set_facecolor('lightgray') # 设置画布的背景色为'lightgray'
ax = plt.gca()
ax.set_facecolor('lightyellow') # 设置图片区域的背景色为'lightyellow'
ax.plot(x, y1, label = 'y = x ** 2')
ax.plot(x, y2, label = 'y = x * 2 + 1')
plt.show()
输出图像如下:
方法2:利用figimage()函数
这个函数对于画布适用,利用gcf()
函数访问画布,之后,访问一个cmap
对象来作为背景色。最后,设置一个颜色数组传给figimage
函数,用来给画布进行着色。
例如,能通过一个颜色渐变的cmap
对象获得一个横向渐变的背景色,此时colorvalue
的值在横向上从0均匀渐变到1,而相同的纵向数值保持相等。此时还要注意,颜色数组的大小要和图像的大小相等,覆盖不到的地方不会设置相应颜色(请注意这里传给figimage
函数的参数colorvalue_fig
的具体的数据格式)
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
width, height, dpi = 8, 6, 100
fig, ax = plt.subplots(1, 1, figsize = (width, height), dpi = dpi)
colorvalue_fig = [np.linspace(0, 1, width * dpi) ] * (height * dpi) # 一个访问cmap的序列
cmap = plt.get_cmap('Wistia') # 一个渐变的cmap
fig.figimage(colorvalue_fig, cmap = cmap)
ax = plt.gca()
ax.plot(x, y1, label = 'y = x ** 2')
ax.plot(x, y2, label = 'y = x * 2 + 1')
plt.show()
输出图像如下:
方法3: 在能够定义fig和ax的函数内给出facecolor参数
例子1:用subplots
函数定义figure
和axe
对象时,能传递画布的背景色facecolor
、框线颜色edgecolor
和框线宽度linewidth
,但是,无法在此处指定图像区域的背景色,只能利用方法1的set_facecolor()
对其进行单独设置。
fig, ax = plt.subplots(1, 1, figsize = (8, 6),
facecolor = 'lightgray', edgecolor = 'green', linewidth = 10)
ax.set_facecolor('lightblue')
ax.plot(x, y1, label = 'y = x ** 2')
ax.plot(x, y2, label = 'y = x * 2 + 1')
plt.show()
例子2:用figure
函数定义figure
对象时传递画布的背景色参数,用subplot
函数定义子图并返回axe
对象时,在函数中传递图像区域的背景色参数facecolor
。
fig = plt.figure(figsize = (8, 6), facecolor = 'lightgray', edgecolor = 'green', linewidth = 10)
ax = plt.subplot(1, 1, 1, facecolor = 'lightyellow')
ax.plot(x, y1, label = 'y = x ** 2')
ax.plot(x, y2, label = 'y = x * 2 + 1')
plt.show()
两段代码能分别输出如下图像:
3、图像主题风格设置
matplotlib工具库带有丰富的风格化参数(style
),我们可以输出当前可用的图像风格:
print(plt.style.available)
输出结果如下:
['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', '_classic_test']
利用plt.style.use()
函数,我们可以从上面的许多图像风格中选择一个新的图像风格,之后绘制图像的风格就会变成了刚刚选择的风格,例如我们转换风格为'seaborn'
:
plt.style.use('seaborn')
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure(figsize = (6, 6), dpi = 100)
ax = plt.subplot(1, 1, 1)
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable')
ax.set_ylabel('Dependent variable')
plt.show()
输出图像如下:
补充:
(1) 我们可以以列表的形式同时导入多套风格
plt.style.use(['seaborn', 'ggplot'])
x = np.linspace(1, 3, 100)
y1 = x ** 2
y2 = x * 2 + 1
figure = plt.figure(figsize = (6, 6), dpi = 100)
ax = plt.gca()
ax.plot(x, y1, label = 'y1 = x ** 2')
ax.plot(x, y2, label = 'y2 = x * 2 + 1')
ax.set_xlabel('Independent variable')
ax.set_ylabel('Dependent variable')
plt.show()
输出图像如下
(2)如果我们只是暂时需要应用一种风格,可以利用with
语句结合context
。在with
语句结束之后,输出的图像会还原至之前设定好的风格:
plt.style.use('seaborn')
with plt.style.context('classic'):
plt.plot(x, y1, label = 'y1 = x ** 2')
plt.plot(x, y2, label = 'y2 = x * 2 + 1')
plt.show()
plt.plot(x, y1, label = 'y1 = x ** 2')
plt.plot(x, y2, label = 'y2 = x * 2 + 1')
plt.show()
两组代码分别输出图像如下。我们可以看到,结合with语句,在前面一段语句下临时使用了classic
风格进行了图像的绘制,而在之后应用的绘图风格仍然是seaborn
至此matplotlib绘图相关的内容就讲解完毕了,文中提到的这些知识基本可以满足数据分析场景下的各种图像绘制需要。
对于缺乏Python基础的同仁,可以通过免费专栏🔥《Python学习笔记(基础)》从零开始学习Python
结语
请始终相信“Done is better than perfect”
,不要过分追求完美,即刻行动就是最好的开始, 一个模块一个模块地积累和练习,必将有所收获。
还有其他的问题欢迎在评论区留言📝!
[版权申明] 非商业目的注明出处可自由转载,转载请标明出处!!!
博客:butterfly_701c