Python 数据分析三剑客之 Matplotlib(四):线性图的绘制


文章目录


Matplotlib 系列文章:


专栏:


推荐学习资料与网站:


这里是一段物理防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 ITBOB。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/105839855
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

【1x00】方法描述

matplotlib.pyplot.plot() 函数可以用于绘制线性图。

本文用到的其他图像属性可参考前面的两篇文章:

《Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性》
《Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图等基本图像属性》

基本语法:matplotlib.pyplot.plot(x, y[, fmt, \*\*kwargs])

参数 描述
x x 轴数据,数组类型或者标量,x 值是可选的,默认为 range(len(y)),通常为一维数组
y y 轴数据,数组类型或者标量,通常为一维数组
fmt str 类型,格式字符串,由标记、线条和颜色部分组成
fmt = '[marker][line][color]',例如 ro 表示红色圆圈,三个参数的取值见后表
**kwargs 可选项,其他 Line2D 属性,常用属性见下表

部分常见 Line2D 属性如下表,完整属性参见官方文档

属性 描述
alpha 线条透明度,float 类型,取值范围:[0, 1],默认为 1.0,即不透明
antialiased / aa 是否使用抗锯齿渲染,默认为 True
color / c 线条颜色,支持英文颜色名称及其简写、十六进制颜色码等,更多颜色示例参见官网 Color Demo
linestyle / ls 线条样式:'-' or 'solid', '--' or 'dashed', '-.' or 'dashdot'
':' or 'dotted', 'none' or ' ' or ''
linewidth / lw 线条宽度,float 类型,默认 0.8
markeredgecolor / mec marker 标记的边缘颜色
markeredgewidth / mew marker 标记的边缘宽度
markerfacecolor / mfc marker 标记的颜色
markerfacecoloralt / mfcalt marker 标记的备用颜色
markersize / ms marker 标记的大小

fmt 中 markerlinecolor 三个参数的取值:

marker:线条标记样式(线条上每个数据点的样式)
字符 描述
'.' 点标记(point marker)
',' 像素点标记(pixel marker)
'o' 圆圈标记(circle marker)
'v' 下三角标记(triangle_down marker)
'^' 上三角标记(triangle_up marker)
'<' 左三角标记(triangle_left marker)
'>' 右三角标记(triangle_right marker)
'1' 下三叉星标记(tri_down marker)
'2' 上三叉星标记(tri_up marker)
'3' 左三叉星标记(tri_left marker)
'4' 右三叉星标记(tri_right marker)
's' 正方形标记(square marker)
'p' 五角形标记(pentagon marker)
'*' 星号标记(star marker)
'h' 六边形标记(hexagon1 marker)
'H' 六边形标记(hexagon2 marker)
'+' 加号标记(plus marker)
'x' X 号标记(x marker)
'D' 菱形标记(diamond marker)
'd' 细菱形标记(thin_diamond marker)
`’ '`
'_' 水平线标记(hline marker)
line:线条样式
字符 描述
'-' 实线样式(solid line style)
'--' 虚线样式(dashed line style)
'-.' 点划线样式(dash-dot line style)
':' 点样式(dotted line style)
color:线条颜色,支持英文颜色名称及其简写、十六进制颜色码等
字符 描述
'b' 蓝色(blue)
'g' 绿色(green)
'r' 红色(red)
'c' 青色(cyan)
'm' 品红(magenta)
'y' 黄色(yellow)
'k' 黑色(black)
'w' 白色(white)

fmt 举例:

'b'    # 默认形状的蓝色标记
'or'   # 红圈
'-g'   # 绿色实线
'--'   # 默认颜色的虚线
'^k:'  # 黑色三角形标记,由虚线连接

【2x00】基本示例

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 设置显示中文

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y = np.sin(3*x)/x
plt.title('线性图示例')   # 设置标题
plt.xlabel('x 轴')       # 设置 x 轴标签
plt.ylabel('y 轴')       # 设置 y 轴标签

plt.plot(x, y)
plt.show()

01

【3x00】多条数据

绘制多条数据,设置不同数据,然后多次调用 plt.plot() 函数即可,不同数据的线条颜色会不同,系统随机,可单独指定不同颜色。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('多数据线性图示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)

plt.show()

02

【4x00】设置颜色 / 样式 / 图例

设置线条颜色样式等属性直接在 plot() 函数里面添加相应参数即可,设置图例则需要调用 legend() 方法。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x1 = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x1)/x1
y2 = np.sin(2*x1)/x1

x3 = np.arange(-2*np.pi, 2*np.pi, 2)
y3 = np.array([0, 2, 1.5, 1, 2.4, -0.2, 1.7])

plt.title('线性图自定义样式示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x1, y1, '--r', label='x1, y1')                               # 线条样式为 --,颜色为 r(红色)
plt.plot(x1, y2, color='green', label='x1, y2')                       # 样式默认,颜色为绿色
plt.plot(x3, y3, marker='o', mfc='r', linestyle=':', label='x3, y3')  # 标记样式为 o,颜色为 r(红色),线条样式为 :
plt.legend(edgecolor='#87A3CC', facecolor='#F5F5F5')                  # 图例

plt.show()

03


这里是一段物理防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 ITBOB。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/105839855
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!

【5x00】设置刻度

调用 xticks()yticks() 函数可以对坐标刻度进行自定义,该函数接收两个参数,第一个参数表示要显示的刻度位置,第二个参数表示在对应刻度线上要显示的标签信息,标签信息支持 LeTeX 数学公式,使用时要用美元符号 $ 包围起来。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('线性图设置刻度示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x, y1, '--r', label='sin(3*x)/x')
plt.plot(x, y2, color='green', linestyle=':', label='sin(2*x)/x')
plt.plot(x, y3, label='sin(1*x)/x')
plt.legend(edgecolor='#87A3CC', facecolor='#F5F5F5')

plt.xticks((-2*np.pi, -np.pi, 0, np.pi, 2*np.pi), (r'$-2\pi$', r'$-\pi$', '$0$', r'$\pi$', r'$2\pi$'))
plt.yticks((-1, 0, 1, 2, 3))

plt.show()

04

【6x00】隐藏画布边框

Matplotlib 所绘制的图表中的每个绘图元素,例如线条 Line2D、文字 Text、刻度等在内存中都有一个对象与之对应。

matplotlib.pyplot.gca() 函数用于获取当前的绘图区 Axes(Get Current Axes)

matplotlib.pyplot.gcf() 函数用于获取当前的画布 Figure(Get Current Figure)

例如:matplotlib.pyplot.plot() 实际上会通过 matplotlib.pyplot.gca() 获得当前的 Axes 对象 ax,然后再调用 ax.plot() 方法实现真正的绘图。我们可以通过这种方法来实现画布边框的隐藏和坐标轴的移动。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('线性图隐藏画布边框示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x, y1, '--r', label='sin(3*x)/x')
plt.plot(x, y2, color='green', linestyle=':', label='sin(2*x)/x')
plt.plot(x, y3, label='sin(1*x)/x')
plt.legend(edgecolor='#87A3CC', facecolor='#F5F5F5')

plt.xticks((-2*np.pi, -np.pi, 0, np.pi, 2*np.pi), (r'$-2\pi$', r'$-\pi$', '$0$', r'$\pi$', r'$2\pi$'))
plt.yticks((-1, 0, 1, 2, 3))

ax = plt.gca()                          # 获取当前的画布, gca = get current axes
ax.spines['right'].set_visible(False)   # 获取绘图区的轴对象(spines),设置右边框不显示
ax.spines['top'].set_visible(False)     # 获取绘图区的轴对象(spines),设置上边框不显示
# ax.spines['right'].set_color('none')  # 设置颜色为 none,效果与上面的一致
# ax.spines['top'].set_color('none')

plt.show()

05

【7x00】移动坐标轴

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('线性图移动坐标轴示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x, y1, '--r', label='sin(3*x)/x')
plt.plot(x, y2, color='green', linestyle=':', label='sin(2*x)/x')
plt.plot(x, y3, label='sin(1*x)/x')
plt.legend(edgecolor='#87A3CC', facecolor='#F5F5F5')

plt.xticks((-2*np.pi, -np.pi, 0, np.pi, 2*np.pi), (r'$-2\pi$', r'$-\pi$', '$0$', r'$\pi$', r'$2\pi$'))
plt.yticks((-1, 0, 1, 2, 3))

ax = plt.gca()                          # 获取当前的画布, gca = get current axes
ax.spines['right'].set_visible(False)   # 获取绘图区的轴对象(spines),设置右边框不显示
ax.spines['top'].set_visible(False)     # 获取绘图区的轴对象(spines),设置上边框不显示
# ax.spines['right'].set_color('none')  # 设置颜色为 none,效果与上面的一致
# ax.spines['top'].set_color('none')

ax.spines['left'].set_position(('data', 0))    # 设置两个坐标轴在(0, 0)位置相交
ax.spines['bottom'].set_position(('data', 0))
ax.xaxis.set_ticks_position('bottom')          # 设置 x 坐标轴标签的位置
ax.yaxis.set_ticks_position('left')            # 设置 y 坐标轴标签的位置

plt.show()

06

【8x00】指定位置显示文本

matplotlib.pyplot.annotate() 方法可以在指定坐标点添加文本或 LaTeX 描述,也可以在其他位置添加描述后,使用箭头指向某个坐标点。

基本语法:matplotlib.pyplot.annotate(text, xy, xytext, xycoords, textcoords, ha, va, arrowprops, \*\*kwargs)

参数 描述
text str 类型,注释的文本
xy 被注释的坐标点,格式:(x, y)
xytext 注释文本的坐标点,格式:(x, y),默认与 xy 相同
xycoords 被注释的坐标点的参考系,取值参见表一,默认为 ‘data’
textcoords 注释文本的坐标点的参考系,取值参见表二,默认为 xycoords 的值
ha 注释点在注释文本的左边、右边或中间(leftrightcenter
va 注释点在注释文本的上边、下边、中间或基线 (topbottomcenterbaseline
arrowprops dict 字典类型,箭头的样式
如果 arrowprops 不包含键 arrowstyle,则允许的键参见表三
如果 arrowprops 包含键 arrowstyle,则允许的键参见表四
表一:xycoords 取值类型
取值 描述
‘figure points’ 以画布左下角为参考,单位为点数
‘figure pixels’ 以画布左下角为参考,单位为像素
‘figure fraction’ 以画布左下角为参考,单位为百分比
‘axes points’ 以绘图区左下角为参考,单位为点数
‘axes pixels’ 以绘图区左下角为参考,单位为像素
‘axes fraction’ 以绘图区左下角为参考,单位为百分比
‘data’ 使用被注释对象的坐标系,即数据的 x, y 轴(默认)
‘polar’ 使用(θ,r)形式的极坐标系
表二:textcoords 取值类型
取值 描述
‘figure points’ 以画布左下角为参考,单位为点数
‘figure pixels’ 以画布左下角为参考,单位为像素
‘figure fraction’ 以画布左下角为参考,单位为百分比
‘axes points’ 以绘图区左下角为参考,单位为点数
‘axes pixels’ 以绘图区左下角为参考,单位为像素
‘axes fraction’ 以绘图区左下角为参考,单位为百分比
‘data’ 使用被注释对象的坐标系,即数据的 x, y 轴
‘polar’ 使用(θ,r)形式的极坐标系
‘offset points’ 相对于被注释点的坐标 xy 的偏移量,单位是点
‘offset pixels’ 相对于被注释点的坐标 xy 的偏移量,单位是像素
表三:arrowprops 不包含键 arrowstyle 时的取值
描述
width 箭头的宽度,以点为单位
headwidth 箭头底部的宽度,以点为单位
headlength 箭头的长度,以点为单位
shrink 箭头两端收缩占总长的百分比
? 其他 matplotlib.patches.FancyArrowPatch 中的关键字,部分常用关键字参见表五
表四:arrowprops 包含键 arrowstyle 时的取值
取值 描述
'-' None
'->' head_length=0.4,head_width=0.2
'-[' widthB=1.0,lengthB=0.2,angleB=None
']-' widthA=1.0, lengthA=0.2, angleA=None
]-[ widthA=1.0, lengthA=0.2, angleA=None, widthB=1.0, lengthB=0.2, angleB=None
`’ -
`'- >'`
'<-' head_length=0.4,head_width=0.2
'<->' head_length=0.4,head_width=0.2
`'< -'`
`'< -
'fancy' head_length=0.4,head_width=0.4,tail_width=0.4
'simple' head_length=0.5,head_width=0.5,tail_width=0.2
'wedge' tail_width=0.3,shrink_factor=0.5
表五:matplotlib.patches.FancyArrowPatch 常用的键
描述
arrowstyle 箭头样式,取值参见表四
connectionstyle 连接方式,默认为 arc3,有以下五种取值:
angle:angleA=90, angleB=0, rad=0.0
angle3:angleA=90, angleB=0
arc:angleA=0, angleB=0, armA=None, armB=None, rad=0.0
arc3:rad=0.0
bar:armA=0.0, armB=0.0, fraction=0.3, angle=None
angle 为箭头旋转的角度,rad 为弧度
relpos 箭头起始点相对注释文本的位置,默认为 (0.5, 0.5),即文本的中心
(0,0)表示左下角,(1,1)表示右上角
patchA 箭头起点处的图形,默认为文本的边框
patchB 箭头终点处的图形,默认为空
shrinkA 箭头起点的缩进点数,默认为2
shrinkB 箭头终点的缩进点数,默认为2
其他键值,参见官方文档 matplotlib.patches.PathPatch
connectionstyle 样式举例

07

应用举例:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(3*x)/x
y2 = np.sin(2*x)/x
y3 = np.sin(1*x)/x
plt.title('线性图显示文本注释示例')
plt.xlabel('x 轴')
plt.ylabel('y 轴')

plt.plot(x, y1, '--r', label='sin(3*x)/x')
plt.plot(x, y2, color='green', linestyle=':', label='sin(2*x)/x')
plt.plot(x, y3, label='sin(1*x)/x')
plt.legend(edgecolor='#87A3CC', facecolor='#F5F5F5')

plt.xticks((-2*np.pi, -np.pi, 0, np.pi, 2*np.pi), (r'$-2\pi$', r'$-\pi$', '$0$', r'$\pi$', r'$2\pi$'))
plt.yticks((-1, 0, 1, 2, 3))

ax = plt.gca()                          # 获取当前的画布, gca = get current axes
ax.spines['right'].set_visible(False)   # 获取绘图区的轴对象(spines),设置右边框不显示
ax.spines['top'].set_visible(False)     # 获取绘图区的轴对象(spines),设置上边框不显示
# ax.spines['right'].set_color('none')  # 设置颜色为 none,效果与上面的一致
# ax.spines['top'].set_color('none')

ax.spines['left'].set_position(('data', 0))    # 设置两个坐标轴在(0, 0)位置相交
ax.spines['bottom'].set_position(('data', 0))
ax.xaxis.set_ticks_position('bottom')          # 设置 x 坐标轴标签的位置
ax.yaxis.set_ticks_position('left')            # 设置 y 坐标轴标签的位置

plt.annotate(r'$\lim_{x\to 0}\frac{\sin(x)}{x}=1$',  # 插入 LaTeX 表达式
             xy=[0, 1],                              # 被标记的坐标
             xycoords='data',                        # 被标记的坐标的参考系
             xytext=[30, 30],                        # 注释文本的坐标
             textcoords='offset points',             # 注释文本的坐标的参考系
             fontsize=16,                            # 字体大小
             arrowprops=dict(arrowstyle="->", connectionstyle="arc3, rad=.2"))  # 箭头样式

plt.show()

08


这里是一段物理防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 ITBOB。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/105839855
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!