pythonic生物人

详解Python matplotlib深度美化(第一期)

你可以灵活地修改Matplotlib的每个默认属性配置,包括图形大小、背景颜色、线条宽度、线型样式、坐标轴刻度、网格线设置、文本格式以及字体等,从而精确控制图形的外观。

本章节里,详细介绍matplotlib绘图美化步骤,一步一步美化直到生成下图,

本期内容「绘图数据+代码+代码详细解释」已上传👉Python matplotlib保姆级教程

Image

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()

Image

这些配置通常能够满足大多数需求。


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)  # 分辨率
Image

❤️Tips:怎么知道Figure有哪些参数可以修改了?

  • 方法1,help(plt.figure)
Image

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',表示浅灰色

Image

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

Image

5.2.5 图例修改

##5.2.5_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author  :   公众号:pythonic生物人
@Desc    :   5.2.5 图例修改
'''

## 图例修改
ax.legend(
    loc="upper right",  # 图例的位置,放置在右上角
    fontsize=10)  # 图例文本的字体大小为10

Image

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轴刻度范围

Image

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表示灰度值)
)

Image

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,意味着网格线会被其他绘制内容覆盖
)

Image

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轴标题的字体大小
)

Image

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

Image

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")

Image

这一章节代码看起来很复杂,其实目的就是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"  # 箭头的颜色,设置为黑色
    ),
)

Image

本期内容「绘图数据+代码+代码详细解释」已上传👉Python matplotlib保姆级教程

👇加入学习(备注:399),

Image