当我们想在同一图中显示两个或多个图时,需要使用子图。我们可以使用两种略有不同的方法以两种方式实现。下面来学习的是熟悉Matplotlib绘制子图的多种方式,子图可以指定位置,也可以自适应大小。
主要内容:
- 绘制子图
- 设置Ticks
- 面向对象API绘制子图
前面我们已经学习了一个图的大部分组件,能绘制一个图,但在实际业务中需要的不止是一个图,会变得很复杂,这就需要我们创建子图了。
先通过plt.figure()
创建得到fig对象,然后使用add_subplot()函数添加子图到fig。完整代码如下:
# 导入库
import random
import matplotlib.pyplot as plt
fig = plt.figure()
# 获取随机数
def get_graphs():
xs = []
ys = []
for i in range(10):
xs.append(i)
ys.append(random.randrange(10))
return xs, ys
# 填加子图
ax = fig.add_subplot(211)
# 绘制子图
x, y = get_graphs()
ax.plot(x, y)
plt.show()
运行后结果如下:
从图表中我们发现子图对象ax
只占了一半的空间,这是为什么呢?
fig对象接受多个子图添加上去,它是顶级容器,而我们添加的子图是ax
,再看看ax = fig.add_subplot(211)
这行代码创建子图所传递的参数"211",它其实是"2"、"1"、"1"
的缩写,它们分别代表:
所以我们看到了上面的效果。
现在我们再添加一个子图到上面的另外一个空间,完整代码如下:
# 导入库
import random
import matplotlib.pyplot as plt
fig = plt.figure()
# 获取随机数
def get_graphs():
xs = []
ys = []
for i in range(10):
xs.append(i)
ys.append(random.randrange(10))
return xs, ys
# 填加子图
ax = fig.add_subplot(211)
# 绘制子图
x, y = get_graphs()
ax.plot(x, y)
# 填加子图二
ax2 = fig.add_subplot(212)
# 绘制子图二
x, y = get_graphs()
ax2.plot(x, y)
plt.show()
运行后效果如下:
可见在图表中显示了两个子图。可在修改add_subplot()函数的参数,设置其它布局的子图。
Ticks是设置用于显示坐标轴上特定点的值,它可以是数字或字符串。每当我们绘制图形时,轴都会采用默认的刻度。Matplotlib的默认刻度在常见情况下是足够我们使用了。下面,我们可以根据自己的需要自定义这些刻度。
参数:
参数 | 值 | 描述 |
---|---|---|
axis | x、y、both | 告知要操作哪个轴 |
reset | true, false | 如果为True,则将所有参数设置为默认值 |
direction | in、out、inout | 将ticks放在里面或外面或两者 |
length | float | 设置刻度线的长度 |
width | float | 设置刻度的宽度 |
rotation | float | 旋转轴上的刻度线 |
colors | color | 改变刻度颜色 |
pad | float | 刻度和标签之间的距离 |
通过Ticks可以对轴上的刻度进行详细的自定义。下面将用一个示例将上面的大部分的参数都进行演示一遍。
# 导入库
import random
import matplotlib.pyplot as plt
fig = plt.figure()
# 获取随机数
def get_graphs():
xs = []
ys = []
for i in range(10):
xs.append(i)
ys.append(random.randrange(10))
return xs, ys
# 添加子图
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
# 隐藏轴上的标记
x, y = get_graphs()
ax1.plot(x, y)
ax1.tick_params(direction='in', length=10, width=2, colors='r')
# 隐藏Y轴的值和标记
x, y = get_graphs()
ax2.plot(x, y)
ax2.axes.get_yaxis().set_visible(False)
# 隐藏值、显示标记
x, y = get_graphs()
ax3.plot(x, y)
ax3.xaxis.set_major_formatter(plt.NullFormatter())
# 倾斜刻度
x, y = get_graphs()
ax4.plot(x, y)
ax4.tick_params(axis='x', rotation=45)
ax4.tick_params(axis='y', rotation=-45)
plt.show()
运行后的效果如下:
使用matplotlib中的面向对象API绘图,是绘制图形和其他数据可视化方法的简单方法。
为子绘图创建类和对象的简单语法是:
class_name,object_name = matplotlib.pyplot.subplots('no_of_rows','no_of_columns')
示例如下:
# 导入库
import matplotlib.pyplot as plt
# 定义X、Y的值
x = [0, 1, 2, 3, 4, 5, 6]
y = [0, 1, 3, 6, 9, 12, 17]
# 用“fig”类创建画布,它的轴是1行2列
fig, axes = plt.subplots(1, 2)
# 绘制第一列图
axes[0].plot(x, y, 'g--o')
# 绘制第二列图
axes[1].plot(y, x, 'm--o')
# 自动调整子图参数
fig.tight_layout()
# 显示绘图
plt.show()
运行后效果如下:
在上面的例子中,我们在绘制图形时使用'axes'('fig'类的对象)作为数组,我们定义行数和列数的乘积N,是创建对象的元素个数N,所以如果我们有2列和2行,那么将有4个元素的数组。
tight_layout()函数的作用是自动调整子图的大小,以填充整个图。
现在我们对绘制子图的函数有了一定了解,开发中根据自己的需求选择相应的画图方式。下面的课程我们将实现更高级的绘制方案。
若有问题,欢迎联系作者(微信:lixu1770105)。