详解Python matplotlib深度美化(第一期)
你可以灵活地修改Matplotlib的每个默认属性配置,包括图形大小、背景颜色、线条宽度、线型样式、坐标轴刻度、网格线设置、文本格式以及字体等,从而精确控制图形的外观。
本章节里,详细介绍matplotlib绘图美化步骤,一步一步美化直到生成下图,
本期内容「绘图数据+代码+代码详细解释」已上传👉Python matplotlib保姆级教程
5.2.1 matplotlib默认出图
##5.2.1_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.1 matplotlib默认出图
'''import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc_file_defaults()
np.random.seed(19680801)
X = np.linspace(0.5, 3.5, 120)
Y1 = 3 + np.cos(X)
Y3 = np.random.uniform(Y1, Y2, 120)
fig = plt.figure()
marg = 0.15
ax = fig.add_axes([marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg])
ax.plot(X, Y1)
ax.plot(X[::3], Y3[::3])
plt.show()
这些配置通常能够满足大多数需求。
5.2.2 Figure修改
Figure修改主要包含Figure的尺寸(长宽)、清晰度(分辨率)等。
##5.2.2_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.2 Figure修改
'''
## Figure修改
fig = plt.figure(
figsize=(9, 8), # 图形大小,宽9英寸,高8英寸
facecolor='1', # 图形背景颜色,'1'表示白色
dpi=150) # 分辨率❤️Tips:怎么知道Figure有哪些参数可以修改了?
方法1,help(plt.figure)
help(plt.figure)后会输出详细的参数介绍,及参数使用的Example。
方法2,翻阅官方文档
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figure
5.2.3 Axes修改
主要设置子图Axes在Figure中的位置(子图上下左右与Figure上下左右的间距)、背景色和长宽尺寸比例等。当前章节中子图通过add_axes方法中的参数设置,还有起他多种方法,后续章节将进行详细介绍。
##5.2.3_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.3 Axes修改
'''## Axes修改
marg = 0.15
ax = fig.add_axes(
[marg, marg, 1 - 1.8 * marg, 1 - 1.8 * marg
], # 子图在Figure中的位置,格式为[left, bottom, width, height],此处留出15%的边距
aspect=1, # 子图的长宽比为1,保持正方形
facecolor='0.9') # 子图的背景颜色为'0.9',表示浅灰色
5.2.4 主图修改
上面的这张图包含一个子图,子图中包含两条折线图主图,该小节美化两条折线主图,
##5.2.4_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.4 主图修改
'''## 主图修改
ax.plot(
X,
Y1,
c='orange', # 线条颜色为橙色
lw=1, # 线条宽度为1
label="Orange signal", # 线条的标签为"Orange signal",方便后续添加图例
zorder=10) # 绘图的zorder,确保其在图形中优先显示
ax.plot(
X[::3],
Y3[::3],
linewidth=0, # 线条宽度为0,仅显示标记不绘制线条
markersize=6, # 标记大小为6
marker='*', # 使用星号形状的标记
markerfacecolor='none', # 标记的内部颜色为空,即透明
markeredgecolor='black', # 标记边缘颜色为黑色
markeredgewidth=1) # 标记边缘宽度为1
5.2.5 图例修改
##5.2.5_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.5 图例修改
'''## 图例修改
ax.legend(
loc="upper right", # 图例的位置,放置在右上角
fontsize=10) # 图例文本的字体大小为10
5.2.6 坐标轴刻度范围修改
##5.2.6_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.6 坐标轴刻度范围修改
'''# 设置坐标轴刻度范围
ax.set_xlim(0, 4) #设置x轴刻度范围
ax.set_ylim(0, 4) #设置y轴刻度范围
5.2.7 坐标轴刻度间隔、格式、大小、颜色等修改
设置xy坐标轴主副刻度间隔、格式、大小、颜色等,
##5.2.7_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.7 坐标轴刻度间隔、格式、大小、颜色等修改
'''## 设置x轴刻度间隔
ax.xaxis.set_major_locator(
MultipleLocator(1.000)) # x轴主刻度间隔为1.000,表示每隔1个单位显示一个主刻度
ax.xaxis.set_minor_locator(AutoMinorLocator(4)) # x轴副刻度为4,表示每两个主刻度之间插入4个副刻度
## 设置y轴刻度间隔
ax.yaxis.set_major_locator(
MultipleLocator(1.000)) # y轴主刻度间隔为1.000,表示每隔1个单位显示一个主刻度
ax.yaxis.set_minor_locator(AutoMinorLocator(4)) # y轴副刻度为4,表示每两个主刻度之间插入4个副刻度
## 设置x轴副刻度的格式
def minor_tick(x, pos):
"""
自定义x轴副刻度标签的格式函数。
传入参数:
- x: 当前刻度值
- pos: 刻度位置
如果x值能被1整除(即为主刻度位置),返回空字符串(不显示标签);否则,返回保留两位小数的刻度值。
"""
if not x % 1.0:
return ""
return f"{x:.2f}"
ax.xaxis.set_minor_formatter(minor_tick)
## 设置坐标轴主刻度的大小、颜色等参数
ax.tick_params(
which='major', # 只应用到主刻度
width=1.0, # 主刻度的线宽为1.0
labelsize=12, # 主刻度标签的字体大小为12
length=10 # 主刻度线的长度为10
)
## 设置坐标轴副刻度的大小、颜色等参数
ax.tick_params(
which='minor', # 只应用到副刻度
width=1.0, # 副刻度的线宽为1.0
length=5, # 副刻度线的长度为5
labelsize=6, # 副刻度标签的字体大小为6
labelcolor='0.5' # 副刻度标签的颜色为灰色(0.5表示灰度值)
)
5.2.8 网格线修改
##5.2.8_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.8 网格线修改
'''## 设置网格线
ax.grid(
linestyle="--", # 网格线的样式,这里使用的是虚线('--' 表示虚线风格)
linewidth=0.5, # 网格线的线宽,0.5 表示较细的线
color='.25', # 网格线的颜色,这里使用了灰度值'.25',表示比较浅的灰色(0 表示黑色,1 表示白色)
zorder=-10 # 网格线的绘制顺序,zorder值越低,图形越靠后显示,这里设置为-10,意味着网格线会被其他绘制内容覆盖
)
5.2.9 标题修改
为Figure、子图、xy坐标轴分别添加标题,
##5.2.9_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.9 标题修改
'''## 为Figure添加标题
fig.suptitle(
'Matplotlib面向对象法', # 图形的整体标题内容
x=0.46, # 标题的水平位置,范围从 0(左)到 1(右),这里设置为略微靠左的位置
fontsize=20, # 标题的字体大小
ha='right' # 标题的水平对齐方式,这里设置为右对齐
)
## 设置子图标题
ax.set_title(
"Matplotlib图形元素", # 子图的标题内容
fontsize=15, # 子图标题的字体大小
verticalalignment='bottom' # 子图标题的垂直对齐方式,这里设置为贴近子图的底部
)
## 设置x坐标轴标题
ax.set_xlabel(
"x轴标题", # x轴的标题内容
fontsize=12 # x轴标题的字体大小
)
## 设置y坐标轴标题
ax.set_ylabel(
"y轴标题", # y轴的标题内容
fontsize=12 # y轴标题的字体大小
)
5.2.10 Figure进一步修改
为Figure添加外框,
##5.2.10_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.10 Figure进一步修改
'''## Figure进一步修改,添加矩形外框
fig.add_artist(
Rectangle(
(0, 0), # 矩形的左下角位置,指定为 (0, 0)
width=1, # 矩形的宽度为 1
height=1, # 矩形的高度为 1
facecolor='none', # 矩形的内部颜色设置为无色(即不填充)
edgecolor='red', # 矩形的边框颜色设置为红色
linewidth=1.0)) # 矩形的边框线宽为 1.0
5.2.11 文本注释修改
本节介绍如何在图表的某个特定点附近显示文本,这里的方法只能添加文本。
##5.2.11_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.11 文本注释修改
'''# 创建在图中添加圆圈注释的方法just_circle
def just_circle(x, y, radius=0.15):
# 创建一个圆圈对象,位置为 (x, y),半径为 radius
c = Circle(
(x, y),
radius, # 圆圈半径
clip_on=False, # 使圆圈不受坐标轴范围的限制
zorder=10, # 绘制顺序,较大的值会在其他元素之上
linewidth=0.6, # 圆圈边缘线的宽度
edgecolor='black', # 圆圈的边缘颜色为黑色
facecolor='none', # 圆圈内部没有填充颜色
path_effects=[withStroke(linewidth=5, foreground=(1, 1, 1, 1))
] # 给圆圈边缘添加一个宽度为5的白色描边效果
)
ax.add_artist(c) # 将圆圈添加到图中
# 创建在图中添加文本注释的方法text
def text(x, y, text):
# 在指定的 (x, y) 位置添加文本注释
ax.text(
x,
y,
text, # 要显示的文本内容
zorder=100, # 绘制顺序,较大的值会在其他元素之上
ha='center', # 水平对齐方式,居中对齐
va='top', # 垂直对齐方式,顶部对齐
weight='bold', # 字体加粗
color='black', # 文本颜色为黑色
style='italic', # 文字样式为斜体
path_effects=[withStroke(linewidth=7,
foreground=(1, 1, 1, 1))] # 添加白色描边效果,使文本更突出
)
# 创建在图中添加文本的方法code
def code(x, y, text):
# 在指定的 (x, y) 位置添加代码说明文本
ax.text(
x,
y,
text, # 要显示的文本内容
zorder=100, # 绘制顺序,较大的值会在其他元素之上
ha='center', # 水平对齐方式,居中对齐
va='top', # 垂直对齐方式,顶部对齐
weight='normal', # 字体正常粗细
color=(0.25, 0.25, 1.00), # 文本颜色为浅蓝色
fontsize='medium', # 字体大小为中等
path_effects=[withStroke(linewidth=7,
foreground=(1, 1, 1, 1))] # 添加白色描边效果,使文本更突出
)
# 创建在图中添加圆圈及其相关文本和代码说明的方法circle
def circle(x, y, txt, cde, radius=0.1):
just_circle(x, y, radius=radius) # 在 (x, y) 位置绘制圆圈,半径为 radius
text(x, y - 0.2, txt) # 在圆圈下方添加文本
code(x, y - 0.33, cde) # 在文本下方添加代码说明
## 调用circle方法
# 在坐标 (4.385, 4.3) 位置添加一个圆圈注释,文本为 "Figure" 和代码说明 "plt.figure"
circle(4.385, 4.3, "Figure", "plt.figure")
circle(4.3, 2.2, "子图, 整个阴影部分", "fig.subplots")
circle(-0.67, 4.43, "Figure标题", "fig.suptitle")
circle(1.08, 4.13, "子图标题", "ax.set_title")
circle(1.75, 2.80, "折线图", "ax.plot")
circle(1.5, 1.64, "标记形状", "ax.plot,marker")
circle(3.00, 3.00, "网格线", "ax.grid")
circle(2.8, 3.65, "图例", "ax.legend")
circle(-0.03, 1.05, "主刻度", "ax.yaxis.set_major_locator")
circle(-0.15, 3.00, "主刻度标签", "ax.yaxis.set_major_formatter")
circle(0.00, 3.75, "副刻度", "ax.yaxis.set_minor_locator")
circle(3.25, -0.10, "副刻度标签", "ax.xaxis.set_minor_formatter")
circle(0.65, 0.01, "x轴", "ax.xaxis")
circle(0, 0.44, "y轴", "ax.yaxis")
circle(1.650, -0.32, "x轴标题", "ax.set_xlabel")
circle(-0.47, 1.68, "y轴标题", "ax.set_ylabel")
circle(4.0, 0.7, "图脊, 边界线", "ax.spines")
circle(-1.17, -0.22, "矩形外框", "fig.add_artist")
circle(4.1, 3.5, "文本、箭头", "ax.annotate/text")
这一章节代码看起来很复杂,其实目的就是3个:
圆圈标记某个部分 添加中文说明 添加使用的matplotlib方法名称
5.2.12 箭头注释修改
本节介绍如何在图表的某个特定点附近显示文本或箭头,这里的方法即可以添加文本,也可以添加箭头,用于解释数据点或为图形提供更多说明。
##5.2.12_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author : 公众号:pythonic生物人
@Desc : 5.2.12 箭头注释修改
'''## 箭头注释
#添加上面部分的箭头
ax.annotate(
"", # 显示的注释文本内容,空字符串表示不显示任何文本
xy=(4, 4), # 被注释的点的坐标,即箭头的目标点为 (4, 4)
xytext=(4.2, 2.2), # 注释文本的起始位置,即箭头的起点为 (4.2, 2.2)
arrowprops=dict( # 设置箭头的属性
arrowstyle="->", # 箭头的样式,这里使用了 "->",表示简单的线形箭头
connectionstyle="arc3", # 箭头的连接样式,这里使用了 "arc3",表示平滑弧形的连接线
color="black" # 箭头的颜色,设置为黑色
),
)
#添加下面部分的箭头
ax.annotate(
"", # 显示的注释文本内容,空字符串表示不显示任何文本
xy=(4, 0), # 被注释的点的坐标,即箭头的目标点为 (4, 0)
xytext=(4.2, 1.8), # 注释文本的起始位置,即箭头的起点为 (4.2, 1.8)
arrowprops=dict( # 设置箭头的属性
arrowstyle="->", # 箭头的样式,这里使用了 "->",表示简单的线形箭头
connectionstyle="arc3", # 箭头的连接样式,这里使用了 "arc3",表示平滑弧形的连接线
color="black" # 箭头的颜色,设置为黑色
),
)
本期内容「绘图数据+代码+代码详细解释」已上传👉Python matplotlib保姆级教程
👇加入学习(备注:399),