Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个企业级项目。


Matplotlib 系列文章:


另有 NumPy、Pandas 系列文章已更新完毕,欢迎关注:


推荐学习资料与网站(博主参与部分文档翻译):



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

【1x00】设置图例

matplotlib.pyplot.legend() 方法可以为图表设置图例。

基本语法:matplotlib.pyplot.legend(\*args, \*\*kwargs)

部分常见参数:

参数描述
loc图例在画布中的位置,默认为 best,其他取值:
best, upper right, upper left, lower left
lower right, right, center left, center right
lower center, upper center, center
也可以用数字 0 - 10 来表示上述位置
bbox_to_anchor调整图例在画布中的位置,当 loc 达不到我们想要的效果时,就可以使用该参数
该参数接收一个二元数组 (x, y),x 用于控制图例的左右移动,值越大越向右边移动
y 用于控制图例的上下移动,值越大,越向上移动
borderaxespad图例距离轴之间的距离,float 类型,默认为 0.5
borderpad图例边框空白区域大小,float 类型,默认为 0.4
columnspacing图例列间距,float 类型,默认为 2.0
edgecolor图例边缘线颜色,支持英文颜色名称及其简写、十六进制颜色码等
更多颜色示例参见官网 Color Demo
facecolor图例背景颜色,默认继承自 axes.facecolor
其他颜色,支持英文颜色名称及其简写、十六进制颜色码等
更多颜色示例参见官网 Color Demo
fancybox是否使用圆形框作为图例背景, 默认为 True
fontsize图例字体大小,默认为 mediumxx-small, x-small, small, medium
large, x-large, xx-large, smaller, larger
也可以使用数字来表示字体大小
framealpha图例透明度,float 类型,默认为 0.8,取值范围:[0, 1]
handleheight图例的高度 ,float 类型,默认为 0.7
handlelength图例的宽度,float 类型,默认为 2.0
handletextpad图例和图例文本之间的水平距离,float 类型,默认为 0.8
labelspacing不同图例之间的垂直距离,float 类型,默认为 0.5
shadow是否给图例添加阴影效果,默认为 False

【1x01】方法一:指定 label 参数

在画图的时候先指定 label 标签文本,再调用 legend() 方法即可。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

plt.plot(a, b, label='图例一')    # 指定 a,b 数据的图例
plt.plot(x, y, label='图例二')    # 指定 x,y 数据的图例

plt.legend(loc=2, edgecolor='red', facecolor='#F5F5F5')  # 指定图例位置、边缘线条颜色和背景色
plt.show()

【1x02】方法二:使用 set_label 方法

在画图的时候先使用 set_label() 方法指定标签文本,再调用 legend() 方法即可。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)
line1.set_label('图例一')    # 指定 a,b 数据的图例
line2.set_label('图例二')    # 指定 x,y 数据的图例

plt.legend(loc=2, edgecolor='red', facecolor='#F5F5F5')  # 指定图例位置、边缘线条颜色和背景色
plt.show()

【1x03】方法三:直接使用 legend 方法

直接使用 legend() 方法来指定图例标签也可以达到同样效果,图例以列表或者元组形式储存,图例与绘制图形的顺序一一对应。

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

plt.plot(a, b)
plt.plot(x, y)

plt.legend(['图例一', '图例二'], loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.show()

也可以使用两个元组,将绘制的图形和图例一一对应来储存:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)

plt.legend((line1, line2), ('图例一', '图例二'), loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.show()

以上三种方法绘制的图形均一致:

01

【2x00】数学公式 LaTeX

LaTeX(LATEX,音译“拉泰赫”)是一种基于 TeX 的排版系统,常用于生成复杂表格和数学公式,Matplotlib 提供了自己的 TeX 表达式解析器,布局引擎和字体,布局引擎基于 Donald Knuth 的 TeX 布局算法改编。使用数学公式时用 $ 将其包围起来即可。具体的符号与其对应的英文表示参见官方文档:https://matplotlib.org/tutorials/text/mathtext.html

应用举例:

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')

plt.plot(t, s)
plt.show()

02

【3x00】调整 x / y 轴刻度和范围

在生成图像时,默认会按照所给的数据均匀设置几个刻度,如果对默认的刻度不满意,则可以使用 xticks()yticks() 方法指定刻度值。xlim()ylim() 则可以设置刻度的范围。

基本语法:
matplotlib.pyplot.xticks([ticks=None, labels=None, \*\*kwargs])
matplotlib.pyplot.yticks([ticks=None, labels=None, \*\*kwargs])

参数描述
ticks数组形式的位置列表,即显示第 n 个位置的刻度,可选项,若传递空列表将删除所有 xtick / ytick
labels数组形式的值,在对应刻度线显示的标签信息。仅当同时传递了刻度时,才能传递此参数
**kwargs其他参数参见 Text

其他参数里面有一个常用的 rotation 参数,次参数可以用于设置刻度标签的旋转角度,对于标签太长的可以将其旋转一个角度来显示。

应用举例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)

plt.plot(x, y)
# x 轴每隔三个显示一次刻度,旋转45°显示标签
plt.xticks(range(2, 26, 3), ('the {} ticks'.format(i) for i in range(2, 26, 3)), rotation=45)

plt.show()

03

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)

plt.xlim((0, 30))   # 设置 x 轴刻度范围
plt.plot(x, y)

plt.show()

04

【4x00】画布边框与坐标轴的移动

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 matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 2*np.pi, np.pi/100)
y = np.sin(x)
plt.plot(x, y)

plt.xlabel('X axis')
plt.ylabel('Y axis')

ticks = (0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi)
labels = ('0', r'$\frac{\pi} {2}$', r'$\pi$', r'$\frac{3\pi} {2}$', r'$2\pi$')
plt.xticks(ticks, labels)                      # 设置 x 坐标轴显示的数据

ax = plt.gca()                                 # 获取当前的画布, gca = get current axes
ax.spines['right'].set_visible(False)          # 设置右边框不显示
ax.spines['top'].set_visible(False)            # 设置上边框不显示
# ax.spines['top'].set_color('none')           # 设置颜色为无也可以

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

plt.show()

05


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

【5x00】创建子图

子图的概念:在同一张画布中创建多个图像,方便对数据进行对比。

【5x01】方法一:add_subplot()

首先创建一个画布,然后利用 add_subplot() 方法填充子图,该方法接收三个参数,前两个参数表示子图有几行几列,最后一个参数表示第几个子图,如:fig.add_subplot(221) 表示总共有两行两列(2x2=4)一共4个子图,当前是第一个子图。若子图大于9个则用逗号隔开即可。

应用举例:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)

fig = plt.figure(figsize=(12, 6))

ax1 = fig.add_subplot(221)   # 第 1 个子图
ax1.plot(x, x)

ax2 = fig.add_subplot(222)   # 第 2 个子图
ax2.plot(x, -x)

ax3 = fig.add_subplot(223)   # 第 3 个子图
ax3.plot(x, x ** 2)

ax4 = fig.add_subplot(224)   # 第 4 个子图
ax4.plot(-x, x ** 2)

plt.show()

06

【5x02】方法二:pyplot.subplot()

matplotlib.pyplot.subplot() 方法和 add_subplot() 方法有点儿类似,同样接收三个参数,前两个参数表示子图有几行几列,最后一个参数表示第几个子图。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)

plt.figure(figsize=(12, 6))

plt.subplot(221)     # 第 1 个子图
plt.plot(x, x)

plt.subplot(222)     # 第 2 个子图
plt.plot(x, x ** 2)

plt.subplot(223)     # 第 3 个子图
plt.plot(x, x ** 3)

plt.subplot(224)     # 第 4 个子图
plt.plot(x, x ** 4)

plt.show()

07

【5x03】方法三:pyplot.subplots()

matplotlib.pyplot.subplots() 函数会将画布分割成指定的列和行,分割后依次在各个区域画图即可。注意与 matplotlib.pyplot.subplot() 略有差别。

fig, axes = plt.subplots 的意思是:plt.subplots 方法会返回一个包含 figure(画布) 和 axes(绘图区) 对象的元组,fig 和 axes 参数分别接收这两个对象,后期对不同绘图区进行处理即可。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
fig, axes = plt.subplots(figsize=(12, 6), nrows=2, ncols=2)  # 将画布分割为2行2列,起始值为0

axes[0][0].plot(x, x)         # 绘制第1行第1列
axes[0][1].plot(x, -x)        # 绘制第1行第2列
axes[1][0].plot(-x, x ** 2)   # 绘制第2行第1列
axes[1][1].plot(x, -x ** 2)   # 绘制第2行第2列

plt.show()

08

【6x00】填充补丁

matplotlib.patches 可用于在画布上填充圆形、长方形、椭圆形、多边形等多种图像补丁。

官方文档:https://matplotlib.org/api/patches_api.html

描述
matplotlib.patches.Arc(xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs)椭圆弧
matplotlib.patches.Arrow(x, y, dx, dy, width=1.0, **kwargs)箭头
matplotlib.patches.Circle(xy, radius=5, **kwargs)
matplotlib.patches.Ellipse(xy, width, height, angle=0, **kwargs)椭圆
matplotlib.patches.CirclePolygon(xy, radius=5, resolution=20, **kwargs)近似多边形的圆形面片
matplotlib.patches.Polygon(xy, closed=True, **kwargs)不规则多边形
matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)矩形
matplotlib.patches.RegularPolygon(xy, numVertices, radius=5, orientation=0, **kwargs)正多边形
matplotlib.patches.Shadow(patch, ox, oy, props=None, **kwargs)创建给定补丁的阴影
matplotlib.patches.Wedge(center, r, theta1, theta2, width=None, **kwargs)楔形

应用举例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes

x = np.arange(0.0, 2.0, 0.01)
y = np.sin(2*np.pi*x)

# 获取当前绘图区(gca = Get Current Axes
ax = plt.gca()

# 圆形:圆点(0.2, -0.25),半径0.2,红色
circle = mpathes.Circle((0.2, -0.25), 0.2, color='r')

# 长方形:左侧和底部坐标(0.25, 0.75),宽0.25,高0.15,透明度0.5
rect = mpathes.Rectangle((0.25, 0.75), 0.25, 0.15, alpha=0.5)

# 正多边形:中心点坐标(1.0, 0),顶点数6,中心到每个顶点的距离0.25
regular_polygon = mpathes.RegularPolygon((1.0, 0), 6, 0.25, color='g')

# 不规则多边形:polygon_point 为要连接的点的坐标
polygon_point = [[1.5, -0.75], [1.75, -1], [2.0, 0], [1.5, -0.25]]
polygon = mpathes.Polygon(polygon_point, color='#FF69B4', alpha=0.3)

# 椭圆形:中心点坐标(1.25, 0.75),横轴长度0.4,垂直轴长度0.2
ellipse = mpathes.Ellipse((1.25, 0.75), 0.4, 0.2, color='y')

# 将补丁添加到当前绘图区
ax.add_patch(circle)
ax.add_patch(rect)
ax.add_patch(regular_polygon)
ax.add_patch(polygon)
ax.add_patch(ellipse)

plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.grid()
plt.plot(x, y)
plt.show()

09

【7x00】保存图像

matplotlib.pyplot.savefig() 方法可以将绘制的图像保存到本地,支持多种格式:eps, pdf, pgf, png, ps, raw, rgba, svg, svgz。

注意:因为调用 plt.show() 函数后,会创建一个新的空白的图片,所以在保存图片时注意要在 plt.show() 前调用 plt.savefig()

基本语法:matplotlib.pyplot.savefig(fname, dpi=None, facecolor='w', edgecolor='w', format=None, transparent=False)

参数描述
fnamestr 类型 / 文件路径 / 类似文件的对象
如果未设置格式,则根据 fname 的扩展名(如果有)和 rcParams[“savefig.format”] = ‘png’ 推断输出格式
如果设置了格式,则它将确定输出格式
dpi保存图片的像素(dpi),以每英寸点数为单位。如果为 None,则默认取 rcParams[’savefig.dpi’] = ‘figure’
facecolor保存图片的画布颜色,默认为 white
edgecolor保存图片的边缘颜色,默认为 white
format保存图片的格式,未设置则取 fname 中的格式
transparent保存图片的背景是否透明

应用举例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(2, 26, 2)
y = range(0, 12)
a = [5, 10, 15, 20, 25, 30]
b = [3, 4, 5, 6, 7, 8]

line1, = plt.plot(a, b)
line2, = plt.plot(x, y)

plt.legend((line1, line2), ('图例一', '图例二'), loc=2, edgecolor='red', facecolor='#F5F5F5')
plt.savefig('D:\\data\\pic.png', transparent=True)  # 保存为透明文件
plt.show()

10


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

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT.BOB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值