Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
pyplot API
matplotlib.pyplot 是使 Matplotlib 像 MATLAB 一样工作的命令样式函数的集合。每个pyplot 函数都会对图形进行一些更改,如创建图形、在图形中创建绘图区域、在绘图区域中绘制一些线条,用标签装饰绘图等。
pyplot 主要用于交互式绘图和程序化绘图生成的简单案例。
安装
# 安装,pandas 会自动安装
pip install matplotlib -U
使用示例
以下是一个简单的折线图示例:
# 约定简写为 plt
import matplotlib.pyplot as plt
x = ['a', 'b', 'c', 'd']
y = [1, 2, 3, 4]
plt.plot(x, y) # 配置 x 轴和 y 轴数据序列
plt.xlabel('x') # 轴标签名
plt.ylabel('y')
plt.title('我的折线图') # 图形标题
plt.show() # 显示图形
我们看到 pyplot API 不如面向对象的 API 灵活,此处看到的大多数函数调用也可以称为 Axes 对象中的方法。
matplotlib 图形显示中文
在绘制图形时,图形中的文由于matplotlib未加载中文字体页显示乱码,需要对计算机做以下配置彻底解决这个问题:
下载字体文件:https://www.fontpalace.com/font-download/simhei/ 。下载后打开文件点击安装,Windows也可复制到系统的fonts文件夹。
查找 matplotlib 配置文件,执行以下代码可返回文件目录,进入这个目录,可以看fonts文件夹和matplotlibrc配置文件,fonts文件夹用于存放字体文件。
# 查找 matplotlib 配置文件
import matplotlib
matplotlib.matplotlib_fname()
修改配置文件,用纯文本编辑器打开matplotlibrc配置文件,修改前请备份一下。使用查找(如快捷键 ctr+F )功能查到并操作:
将 font.family: sans-serif 前面的 # 号去掉
将 font.sans-serif 前面的 # 号去掉,后面新增 SimHei,
将 axes.unicode_minus 前面的 # 号去掉,并将将 True 改为 False,作用就是解决负号'-'显示为方块的问题。
最终这几行的结果为:
font.family : sans-serif
font.sans-serif : SimHei, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
axes.unicode_minus : False
找到缓存文件目录并删除,Mac电脑和转到/Users/hui/.matplotlib(其中hui是你自己的电脑用户名),Windows电脑的路径为C:\Users\hui.matplotlib,将tex.cache和fontList.json等文件全删除。
重启 Jupyter 并重新执行代码
如果仍然有问题,可再增加临时代码,可能重新构建一下:
from matplotlib.font_manager import _rebuild
# 重新加载
_rebuild()
如还没解决,可重启电脑试试。
结构
在 Matplotlib 中,figure 是 axes 的父容器,而 axes 是 figure 的内部元素,而我们常用的各种图表、图例、坐标轴等则又是 axes 的内部元素。
图形(类 plt.Figure 的一个实例)可以被认为是一个包括所有维度、图像、文本和标签对象的容器,相当于是提供了画板。
维度(类 plt.Axes 的一个实例)则定义了画板中的每一个绘图对象 Axes,一个有边界的格子包括刻度和标签,相当于画板内的各个子图。
plt.subplot,主要接收3个数字或1个3位数(自动解析成3个数字,要求解析后数值合理)作为子图的行数、列数和当前子图索引,索引从1开始(与MATLAB保存一致),返回一个axes对象用于绘图操作。这里,可以理解成是先隐式执行了plt.figure,然后在创建的figure对象上添加子图,并返回当前子图实例
plt.subplots,主要接收一个行数nrows和列数ncols作为参数(不含第三个数字),创建一个figure对象和相应数量的axes对象,同时返回该figure对象和axes对象嵌套列表,并默认选择最后一个子图作为"当前"图
一般,我们会使用变量名 fig 来指代图形对象,以及变量名 ax 来指代维度变量,创建了维度,可以使用 ax.plot 方法将数据绘制在图表上。
创建这这元素的方法:
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0, 10, 500)
# ax.plot(x, np.sin(x)) 同下,也可创建图形
plt.plot(x, np.sin(x))
# 创建两条线
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
# plt.show() 可省略
元素
元素{.center}
元素的细节设置如下。
风格
可对全局的样式进行配置:
plt.style.use('seaborn-whitegrid')
# 查看可用样式
plt.style.available
线条颜色
以下几种赋值方式:
plt.plot(x, np.sin(x - 0), color='blue') # 颜色名称指定
plt.plot(x, np.sin(x - 1), color='g') # 颜色简写名称指定(rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75') # 介于0-1之间的灰阶值
plt.plot(x, np.sin(x - 3), color='#FFDD44') # 16进制的RRGGBB值
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # RGB元组的颜色值,介于0-1
plt.plot(x, np.sin(x - 5), color='chartreuse'); # 能支持所有HTML颜色名称值
17 种标准色颜色名为:aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, white, yellow。
线条的风格
# 对应下方
plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted');
# 还可以用形象的符号代表线条风格
plt.plot(x, x + 4, linestyle='-') # 实线
plt.plot(x, x + 5, linestyle='--') # 虚线
plt.plot(x, x + 6, linestyle='-.') # 长短点虚线
plt.plot(x, x + 7, linestyle=':'); # 点线
颜色线条合并
linestyle 和 color 参数能够合并成一个非关键字参数:
plt.plot(x, x + 0, '-g') # 绿色实线
plt.plot(x, x + 1, '--c') # 天青色虚线
plt.plot(x, x + 2, '-.k') # 黑色长短点虚线
plt.plot(x, x + 3, ':r'); # 红色点线
plt.plot(x, x + 4, 'or') # 红色大圆点
# 其他 ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']
坐标轴范围
如果对自动匹配的坐标轴范围不满意,可以自己进行相关调整。
plt.plot(x, -np.sin(x))
plt.xlim(-1, 5)
plt.ylim(-2.5, 2.5);
# axis 也可以,传入 [xmin, xmax, ymin, ymax]
plt.plot(x, -np.sin(x))
plt.axis([-1, 5, -2.5, 2.5]);
# 设置x轴与y轴组成正方形,可参考文档关于字符串说明
plt.plot(x, np.sin(x))
plt.axis('square')
# x 轴从 y 轴 0 开始
# 绘制点之外的边界设置为零
plt.margins(x=0)
坐标轴标签
可设置轴上的标签文本:
plt.plot(x, np.sin(x))
plt.title("A Sine Curve") # 标题
plt.xlabel("x") # x 轴标签
plt.ylabel("sin(x)") # y 轴标签
标签的位置、大小和风格可以通过上面函数的可选参数进行设置:
plt.plot(x, np.sin(x))
plt.plot(x, np.sin(x))
plt.xlabel("x side",
color='r', # 颜色
fontsize=20, # 字号
labelpad=-1, # 与轴的上下距离
loc='right' # 位置居右
)
其他
plt.figure(figsize=(10,5)) # 图形和大小
plt.xticks(rotation=45) # x 轴上标签的角度
# 设置时间标签显示格式
import matplotlib.dates as mdate
ax.xaxis.set_major_formatter(mdate.DateFormatter('%Y-%m-%d'))
# 指定坐标上标注一个红框的 note 字符
plt.text(5, 5, 'note', bbox=dict(facecolor='red', alpha=0.5))
图例
plt.plot(x, np.sin(x), '-g', label='sin(x)')
plt.plot(x, np.cos(x), ':b', label='cos(x)')
plt.legend() # 图例
# 其他参数
plt.legend(['sin(x) line', 'cos(x) line']) # 指定文案
面向对象操作
ax = plt.axes()
ax.plot(x, np.sin(x))
ax.set(xlim=(0, 10), ylim=(-2, 2),
xlabel='x', ylabel='sin(x)',
title='A Simple Plot');
散点图
简单使用:
fig = plt.figure()
x = np.linspace(1, 101, 100, dtype='int')
y = np.random.normal(10, 20, size=100)
plt.scatter(x, y)
更多参数:
rng = np.random.RandomState(123)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
plt.scatter(x, y,
c=colors, # 标记颜色
s=sizes, # 点标记大小
alpha=0.3, # 透明度
cmap='viridis' # 色系
)
plt.xlabel('x')
plt.ylabel('y')
plt.colorbar(); # 显示颜色对比条
参考
https://matplotlib.org/tutorials/introductory/pyplot.html
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html
https://matplotlib.org/gallery/index.html
https://mp.weixin.qq.com/s/6V3JlvitxhWhf2fk_gPviw
https://www.runoob.com/numpy/numpy-matplotlib.html
https://www.runoob.com/w3cnote/matplotlib-tutorial.html
https://www.bilibili.com/video/BV1Mi4y1n7wb
https://www.bilibili.com/video/BV1jt4y1C72a