共享绘图区域的坐标轴
(1)共享单一绘图区域的坐标轴
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False
x = np.arange(0.05,10.0,0.01)
y = np.exp(x)
fig,ax1 = plt.subplots()
ax1.plot(x,y,ls = '--',lw = 2,color = 'b')
ax1.set_xlabel('x坐标轴')
ax1.set_ylabel('以e为底指数函数',color = 'b')
ax1.tick_params('y',colors = 'b')
ax2 = ax1.twinx()
y2 = np.cos(x**2)
ax2.plot(x,y2,ls = '-',color = 'r')
ax2.set_ylabel('余弦函数',color = 'r')
ax2.tick_params('y',colors = 'r')
plt.show()
代码说明:1.使用tick_params()设置主刻度线和刻度标签
2.调用ax1.twinx()生成实例ax2,此时实例ax2的x轴与实例ax1的x轴是共享的,实例ax2的刻度线和刻度标签在右侧轴处绘制
运行结果:
(2)共享不同子区绘图区域的坐标轴
调用subplots()中的参数sharey(或是sharex)来实现共享不同子区绘图区域的坐标轴
sharex和sharey的取值形式有四种:row,col,all,none
1.sharex(sharey)不同参数下的图形
以下是为设置sharex(sharey)参数的情况:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
x1 = np.linspace(0,2*np.pi,400)
y1 = np.cos(x1**2)
x2 = np.linspace(0.01,10,100)
y2 = np.sin(x2)
x3 = np.random.rand(100)
y3 = np.linspace(0,3,100)
x4 = np.arange(0,6,0.5)
y4 = np.power(x4,3)
fig,ax = plt.subplots(2,2)
ax1 = ax[0,0]
ax1.plot(x1,y1)
ax2 = ax[0,1]
ax2.plot(x2,y2)
ax3 = ax[1,0]
ax3.scatter(x3,y3)
ax4 = ax[1,1]
ax4.scatter(x4,y4)
plt.show()
运行结果:
情形1:sharex = 'all'
我们只需要将plt.subplots(2,2)改成plt.subplots(2,2,sharex = 'all'),其他语句都不需要变化
fig,ax = plt.subplots(2,2,sharex = 'all')
运行结果:
对比设置参数和没有设置参数的图形知:4幅图形的x轴取值范围使用了相同的范围,而且采用了x2取值范围作为x轴的共享范围,变量x2的取值范围的最大值是其他变量取值范围上限里的最大值
情形2:sharex = 'none'
这种情况就是plt.subplots(2,2)
fig,ax = plt.subplots(2,2,sharex = 'none')
运行结果:
情形3:sharex = 'row'
fig,ax = plt.subplots(2,2,sharex = 'row')
运行结果:
这种情况是把子区的每一行的图形的x轴取值范围实现共享,而且是选择每一行中图形的x轴取值范围上限最大的那个取值范围作为共享范围
情形4:sharex = 'col'
fig,ax = plt.subplots(2,2,sharex = 'col')
运行结果:
这种情况是把子区的每一列的图形的x轴取值范围实现共享,而且是选择每一列中图形的x轴取值范围上限最大的那个取值范围作为共享范围
当然参数sharex和参数sharey可以同时使用
2.将共享坐标轴的子区之间的空隙去掉
import matplotlib.pyplot as plt
import numpy as np
x1 = np.linspace(0,2*np.pi,400)
y1 = np.cos(x1**2)
x2 = np.linspace(0.01,10,100)
y2 = np.sin(x2)
x3 = np.random.rand(100)
y3 = np.linspace(0,3,100)
x4 = np.arange(0,6,0.5)
y4 = np.power(x4,3)
fig,(ax1,ax2,ax3,ax4) = plt.subplots(4,1,sharex = 'all')
fig.subplots_adjust(hspace=0)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.scatter(x3,y3)
ax4.scatter(x4,y4)
plt.show()
代码说明: 1.plt.subplots(4,1,sharex = 'all')实现共享x轴的坐标轴刻度标签
2.fig.subplots_adjust(hspace=0)实现将4幅子图的水平方向的空隙去除
运行结果:
(3)共享个别子区绘图区域的坐标轴
1.个别子区共享绘图区域的坐标轴
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
x1 = np.linspace(0,2*np.pi,400)
y1 = np.cos(x1**2)
x2 = np.linspace(0.01,10,100)
y2 = np.sin(x2)
x3 = np.random.rand(100)
y3 = np.linspace(0,3,100)
x4 = np.arange(0,6,0.5)
y4 = np.power(x4,3)
fig,ax = plt.subplots(2,2)
ax1 = plt.subplot(221)
ax1.plot(x1,y1)
ax2 = plt.subplot(222)
ax2.plot(x2,y2)
ax3 = plt.subplot(223)
ax3.scatter(x3,y3)
ax4 = plt.subplot(224,sharex = ax1)
ax4.scatter(x4,y4)
plt.show()
代码说明: 通过ax4 = plt.subplot(224,sharex = ax1)可以让子区4的x轴范围和子区1的x轴范围共享
运行结果:
2.用函数plt.autoscale()调整坐标轴范围
如果我们对某个子区的坐标轴范围和数据范围的搭配比例不满意,可以使用autoscale()进行坐标轴范围的自适应调整。调用签名是:autoscale(enable = True,axis = 'both',tight = True)
enable | 进行坐标轴范围的自适应调整 |
axis | 使x,y轴都进行自适应调整 |
tight | 让坐标轴的范围调整到数据的范围上 |
在上面代码的基础上,对ax2进行自适应调整代码如下:
ax2.autoscale(enable = True,axis = 'both',tight = True)
运行结果: