Matplotlib 是支持 Python 语言的开源绘图库,支持丰富的绘图类型、简单的绘图方式以及完善的接口文档.
在使用 Notebook 环境绘图时,需要先运行 Jupyter Notebook 的魔术命令 %matplotlib inline。这条命令的作用是将 Matplotlib 绘制的图形嵌入在当前页面中。而在桌面环境中绘图时,不需要添加此命令,而是在全部绘图代码之后追加 plt.show()。
简单示例:
from matplotlib import pyplot as plt
plt.plot([1, 2, 3, 2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1])
plt.plot() 是 pyplot 模块下面的直线绘制(折线图)方法类。示例中包含了一个 [1, 2, 3, 2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1] 列表,Matplotlib 会默认将该列表作为 𝑦 值,而 𝑥 值会从 0 开始依次递增。
自定义横坐标刻度:
plt.plot([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[1, 2, 3, 2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1])
更多类型图
更多详细内容参考官方地址
一 常用图形示例
1. 折线图示例
matplotlib.pyplot.plot(*args, **kwargs)
方法严格来讲可以绘制线形图或者样本标记。其中,*args允许输入单个 𝑦 值或 𝑥,𝑦 值。kwargs 的部分就是用于设置样式参数了。
import numpy as np # 载入数值计算模块
from matplotlib import pyplot as plt
# 在 -2PI 和 2PI 之间等间距生成 1000 个值,也就是 X 坐标
X = np.linspace(-2*np.pi, 2*np.pi, 1000)
# 计算 y 坐标
y = np.sin(X)
# 向方法中 `*args` 输入 X,y 坐标
plt.plot(X, y)
2.柱状图示例
matplotlib.pyplot.bar(*args, **kwargs)
plt.bar([1, 2, 3], [1, 2, 3])
3.散点图示例
matplotlib.pyplot.scatter(*args, **kwargs)
# X,y 的坐标均有 numpy 在 0 到 1 中随机生成 1000 个值
X = np.random.ranf(1000)
y = np.random.ranf(1000)
# 向方法中 `*args` 输入 X,y 坐标
plt.scatter(X, y)
4.饼状图示例
matplotlib.pyplot.pie(*args, **kwargs)
plt.pie([1, 2, 3, 4, 5])
二 定义图形样式
折线图样式常用参数:
linestyle :线条样式
Linestyle | 效果 |
---|---|
‘-’ or ‘solid’ | 实线 |
‘–’ or ‘dashed’ | 虚线 |
‘-.’ or ‘dashdot’ | 标准虚线 |
‘:’ or ‘dotted’ | 点虚线 |
‘None’ or ’ ’ or ‘’ | 什么也没有 |
linewidth: 线宽
alpha: 透明度(0-1)
color:颜色 (常用颜色简写:red-r, green-g, black-k, blue-b, yellow-y)
示例:
X = np.linspace(-2 * np.pi, 2 * np.pi, 1000)
# 计算 sin() 对应的纵坐标
y1 = np.sin(X)
# 计算 cos() 对应的纵坐标
y2 = np.cos(X)
# 向方法中 `*args` 输入 X,y 坐标
plt.plot(X, y1, color='r', linestyle='--', linewidth=2, alpha=0.8)
plt.plot(X, y2, color='b', linestyle='-', linewidth=2)
散点图样式常用参数:
s= 散点大小
c= 散点颜色
marker= 散点样式
cmap= 定义多类别散点的颜色
alpha= 点的透明度
edgecolors= 散点边缘颜色
# 生成随机数据
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
size = np.random.normal(50, 60, 10)
plt.scatter(x, y, s=size, c=colors) # 绘制散点图
饼图样式常用参数:
x:array,表示用于绘制饼图的数据,没有默认。
explode:array,默认为None。如果不是None,是一个长度与x相同长度的数组,用来指定每部分的偏移量或者说指定项距离饼图圆心为n个半径。
labels:array,默认为:None。指定每一个饼块的名称。
colors:特定的string或含颜色字符的array,默认为:None。
autopct:特定的string,默认是None。 指定数值的显示方式。
pctdistance:float,默认值:0.6。 指定每一项的比例autopct和距离圆心的半径。
labeldistance:float,默认值:1.1。 指定每一项的名称label和距离圆心的半径。
startangle:float,默认:None。 如果不是None,从x轴逆时针旋转饼图的开始角度。
radius:float,默认为:1。饼图的半径。
label = 'Cat', 'Dog', 'Cattle', 'Sheep', 'Horse' # 各类别标签
color = 'r', 'g', 'r', 'g', 'y' # 各类别颜色
size = [1, 2, 3, 4, 5] # 各类别占比
explode = (0, 0, 0, 0, 0.2) # 各类别的偏移半径
# 绘制饼状图
plt.pie(size, colors=color, explode=explode,
labels=label, shadow=True, autopct='%1.1f%%')
# 饼状图呈正圆
plt.axis('equal')
组合图样式:
只需要将所需图形的代码放置在一起就可以,但是两张图的横坐标必须共享,才能够被 Matplotlib 自动判断为组合图效果。
示例:
x = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
y_bar = [3, 4, 6, 8, 9, 10, 9, 11, 7, 8]
y_line = [2, 3, 5, 7, 8, 9, 8, 10, 6, 7]
plt.bar(x, y_bar)
plt.plot(x, y_line, '-o', color='y')
三 图形位置
figure 相当于绘画用的画板,而 axes 则相当于铺在画板上的画布。
add_axes() 方法向我们设置的画板 figure 中添加画布 axes
x = np.linspace(0, 10, 20) # 生成数据
y = x * x + 2
fig = plt.figure() # 新建图形对象
axes = fig.add_axes([0.5, 0.5, 0.8, 0.8]) # 控制画布的左, 下, 宽度, 高度
axes.plot(x, y, 'r')
还可以实现大图套小图
fig = plt.figure() # 新建画板
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 大画布
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 小画布
axes1.plot(x, y, 'r') # 大画布
axes2.plot(y, x, 'g') # 小画布
还有一种添加画布的方式,那就是 plt.subplots()
fig, axes = plt.subplots()
axes.plot(x, y, 'r')
借助于 plt.subplots(),我们就可以实现子图的绘制,也就是将多张图按一定顺序拼接在一起。
fig, axes = plt.subplots(nrows=1, ncols=2) # 子图为 1 行,2 列
for ax in axes:
ax.plot(x, y, 'r')
通过设置 plt.subplots 的参数,可以实现调节画布尺寸和显示精度。
fig, axes = plt.subplots(
figsize=(16, 9), dpi=50) # 通过 figsize 调节尺寸, dpi 调节显示精度
axes.plot(x, y, 'r')
四 规范画图
1.添加图标题、图例
loc 参数标记图例位置,1,2,3,4 依次代表:右上角、左上角、左下角,右下角;0 代表自适应
fig, axes = plt.subplots()
axes.set_xlabel('x label') # 横轴名称
axes.set_ylabel('y label')
axes.set_title('title') # 图形名称
axes.plot(x, x**2)
axes.plot(x, x**3)
axes.legend(["y = x**2", "y = x**3"], loc=0) # 图例
2.线型、颜色、透明度
fig, axes = plt.subplots()
axes.plot(x, x+1, color="red", alpha=0.5)
axes.plot(x, x+2, color="#1155dd")
axes.plot(x, x+3, color="#15cc55")
3. 画布网格、坐标轴范围
设置画布网格和坐标轴范围。这里通过指定 axes[0] 序号,来实现子图的自定义顺序排列。
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False,sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
参考原文:https://blog.csdn.net/henni_719/article/details/77479912
输入参数说明:
nrows,ncols:整型,可选参数,默认为1。表示子图网格(grid)的行数与列数。
sharex,sharey:布尔值或者{‘none’,‘all’,‘row’,‘col’},默认:False
控制x(sharex)或y(sharey)轴之间的属性共享:
1.True或者’all’:x或y轴属性将在所有子图(subplots)中共享.
2.False或’none’:每个子图的x或y轴都是独立的部分
3.‘row’:每个子图在一个x或y轴共享行(row)
4.‘col’:每个子图在一个x或y轴共享列(column)
当子图在x轴有一个共享列时(‘col’),只有底部子图的x tick标记是可视的。
同理,当子图在y轴有一个共享行时(‘row’),只有第一列子图的y tick标记是可视的。
squeeze:布尔类型,可选参数,默认:True。
* 如果是True,额外的维度从返回的Axes(轴)对象中挤出。
》如果只有一个子图被构建(nrows=ncols=1),结果是单个Axes对象作为标量被返回。
》对于N1或1N个子图,返回一个1维数组。
》对于N*M,N>1和M>1返回一个2维数组。
*如果是False,不进行挤压操作:返回一个元素为Axes实例的2维数组,即使它最终是1x1。
subplot_kw:字典类型,可选参数。把字典的关键字传递给add_subplot()来创建每个子图。
gridspec_kw字典类型,可选参数。把字典的关键字传递给GridSpec构造函数创建子图放在网格里(grid)。
**fig_kw:把所有详细的关键字参数传给figure()函数
返回结果:
fig:matplotlib.figure.Figure对象
ax:Axes(轴)对象或Axes(轴)对象数组。
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
# 显示网格
axes[0].plot(x, x**2, x, x**3, lw=2)
axes[0].grid(True)
# 设置坐标轴范围
axes[1].plot(x, x**2, x, x**3)
axes[1].set_ylim([0, 60])
axes[1].set_xlim([2, 5])
4.图形标注
文字标注的方法由 matplotlib.pyplot.text() 实现。最基本的样式为 matplotlib.pyplot.text(x, y, s),其中 x, y 用于标注位置定位,s 代表标注的字符串。除此之外,你还可以通过 fontsize= , horizontalalignment= 等参数调整标注字体的大小,对齐样式等。
fig, axes = plt.subplots()
x_bar = [10, 20, 30, 40, 50] # 柱形图横坐标
y_bar = [0.5, 0.6, 0.3, 0.4, 0.8] # 柱形图纵坐标
bars = axes.bar(x_bar, y_bar, color='blue', label=x_bar, width=2) # 绘制柱形图
for i, rect in enumerate(bars):
x_text = rect.get_x() # 获取柱形图横坐标
y_text = rect.get_height() + 0.01 # 获取柱子的高度并增加 0.01
plt.text(x_text, y_text, '%.1f' % y_bar[i]) # 标注文字
通过 matplotlib.pyplot.annotate() 方法向图像中添加箭头等样式标注。
fig, axes = plt.subplots()
bars = axes.bar(x_bar, y_bar, color='blue', label=x_bar, width=2) # 绘制柱形图
for i, rect in enumerate(bars):
x_text = rect.get_x() # 获取柱形图横坐标
y_text = rect.get_height() + 0.01 # 获取柱子的高度并增加 0.01
plt.text(x_text, y_text, '%.1f' % y_bar[i]) # 标注文字
# 增加箭头标注
#xy=() 表示标注终点坐标,xytext=() 表示标注起点坐标。
#在箭头绘制的过程中,arrowprops=() 用于设置箭头样式,facecolor= 设置颜色,width= 设置箭尾宽度,headwidth= 设置箭头宽度,可以通过 arrowstyle= 改变箭头的样式。
plt.annotate('Min', xy=(32, 0.3), xytext=(36, 0.3),
arrowprops=dict(facecolor='black', width=1, headwidth=7))