小黄人番外短片合集 — 第9集【Changing Light Bulb 换灯泡】
Matplotlib 系列文章(持续更新中):
- 《Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件》
- 《Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性》
- 《Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图等基本图像属性》
文章目录
这里是一段防爬虫文本,请读者忽略。
本文原创首发于 CSDN,作者 TRHX。
博客首页:https://itrhx.blog.csdn.net/
本文链接:https://itrhx.blog.csdn.net/article/details/105828143
【1x00】设置图例
matplotlib.pyplot.legend()
方法可以为图表设置图例。
基本语法:matplotlib.pyplot.legend(\*args, \*\*kwargs)
部分常见参数:
参数 | 描述 |
---|---|
borderaxespad | 图例距离轴之间的距离,float 类型,默认为 0.5 |
borderpad | 图例边框空白区域大小,float 类型,默认为 0.4 |
columnspacing | 图例列间距,float 类型,默认为 2.0 |
edgecolor | 图例边缘线颜色,支持英文颜色名称及其简写、十六进制颜色码等 更多颜色示例参见官网 Color Demo |
facecolor | 图例背景颜色,默认继承自 axes.facecolor 其他颜色,支持英文颜色名称及其简写、十六进制颜色码等 更多颜色示例参见官网 Color Demo |
fancybox | 是否使用圆形框作为图例背景, 默认为 True |
fontsize | 图例字体大小,默认为 medium ,xx-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 |
loc | 图例在画布中的位置,默认为 best,其他取值:best , upper right , upper left , lower left lower right , right , center left , center right lower center , upper center , center 也可以用数字 0 - 10 来表示上述位置 |
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()
以上三种方法绘制的图形均一致:
【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()
【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()
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()
【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()
【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()
【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()
【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()
【6x00】保存图像
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)
参数 | 描述 |
---|---|
fname | str 类型 / 文件路径 / 类似文件的对象 如果未设置格式,则根据 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()