1.一个区域,左右两边都有纵坐标
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
fig, ax1 = plt.subplots()
t = np.arange(0.05, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, c='b', ls='-')
ax1.set_xlabel('x坐标轴')
ax1.set_ylabel('以e为底指数函数', c='b')
ax1.tick_params('y', colors='b')
ax2 = ax1.twinx()
s2 = np.cos(t**2)
ax2.plot(t, s2, c='r', ls=':')
ax2.set_ylabel("余弦函数", c='r')
ax2.tick_params('y', colors='r')
plt.show()
使用ax1.set_ylabel()和ax1.tick_params()实例方法将y轴标签、主刻度线和刻度标签都设置成蓝色。调用实例方法ax1.twinx()生成实例ax2,此时实例ax2的x轴与实例ax1的x轴是共享的,实例ax2的刻度线和刻度标签在右侧轴脊处绘制。
2.在子区域里共享坐标轴
调用签名使用“subplots( 1,2,sharey=True)“的形式,其中参数sharey表示子区1和子区2共享y坐标轴。相对应的,还可以设置参数sharex的取值形式。具体而言,参数sharex和参数sharey的取值形式有四种,分别是row、col、all和none, 其中all和none分别等同于“True” 和“False”。 下面我们参数sharey的取值形式与使用方法和参数sharex完全相同,不赘述。 先放一张原始的图:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
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)
ax1 = ax[0, 1]
ax1.plot(x2, y2)
ax1 = ax[1, 0]
ax1.scatter(x3, y3)
ax1 = ax[1, 1]
ax1.scatter(x4, y4)
plt.show()
plt.subplots(2, 2)加上sharex=‘all‘的效果,会让横坐标变得统一。而且横坐标是取子区域里最大的那个。
plt.subplots(2, 2,sharex='all')
plt.subplots(2, 2,sharex='col')
plt.subplots(2, 2,sharex='row')
当然还可以有办法把子图间的空隙去掉,plt.subplots_adjust(hspace=0) 就是去除水平方向空隙。(代码放在设置共享坐标的下面)
3.移动坐标轴的
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
x = np.linspace(-2*np.pi, 2*np.pi, 200)
y = np.sin(x)
y2 = np.cos(x)
ax = plt.subplot(111)
plt.plot(x, y, ls='-', lw=2, label='$sin(x)$')
plt.plot(x, y2, ls='-', lw=2, label='$cos(x)$')
plt.legend(loc='lower left')
plt.xlim(-2*np.pi, 2*np.pi)
plt.xticks([-2*np.pi, -3*np.pi/2, -1*np.pi, -1*np.pi/2, 0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi],
[r"$-2\pi$", r"$-3\pi/2$", r"$-\pi$", r"$-2\pi/2$", r"$0$", r"$pi/2$", r"$\pi$", r"$3\pi/2$", r"$2\pi$"])
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.show()
代码主体部分,我们主要调用前面章节的代码内容,在此基础上,我们添加了两条关键代码: ①ax.spines[‘bottom’].set_position((‘data’, 0)) ②ax.spines[‘left’].set_position((‘data’, 0)) ax.spines会调用轴脊字典,其中的键是轴脊位置,如"top““right”“bottom"“left"键值是matplotlib.spines.Spine对象,实例方法set position()就是对轴脊位置的控制方法,其中参数“data" 说明控制轴脊位置的坐标值与折线图的坐标系统一致。 因此,参数0就表示将底端轴脊移动到左侧轴脊的零点处。同理,将左侧轴脊移动到底端轴脊的零点处。在matplotib元素组成结构中,已经说明轴脊是刻度线和刻度标签的载体。这样,当左侧和底端轴脊移动位置时,刻度线和刻度标签也会相应的移动位置。我们将x轴刻度线放在底端轴脊上,将y轴刻度线放在左侧轴脊上。从而,完成 移动坐标轴位置的工作。
参考书目《Python数据可视化之matplotlib实践》。
|