我是一名 Matlab 用户,最近转换为 Python。大部分 Python 技能都是我自己掌握的,但在绘图方面我遇到了困难,需要一些帮助。
这就是我正在尝试做的......
我需要制作一个由 3 个具有以下属性的子图组成的图形:
- 子图布局为 311、312、313
- 312和313的高度约为311的一半
- 所有子图共享共同的 X 轴
- 子图之间的空间为 0(它们在 X 轴上相互接触)
顺便说一句,我知道如何制作这一切,但不是用一个数字。这就是我现在面临的问题。
例如,这是我理想的子图布局:
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s1 = np.sin(2*np.pi*t)
s2 = np.exp(-t)
s3 = s1*s2
fig = plt.figure()
ax1 = plt.subplot2grid((4,3), (0,0), colspan=3, rowspan=2)
ax2 = plt.subplot2grid((4,3), (2,0), colspan=3)
ax3 = plt.subplot2grid((4,3), (3,0), colspan=3)
ax1.plot(t,s1)
ax2.plot(t[:150],s2[:150])
ax3.plot(t[30:],s3[30:])
plt.tight_layout()
plt.show()
请注意不同子图的 x 轴是如何未对齐的。我不知道如何对齐图中的 x 轴,但如果我这样做:
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s1 = np.sin(2*np.pi*t)
s2 = np.exp(-t)
s3 = s1*s2
fig2, (ax1, ax2, ax3) = plt.subplots(nrows=3, ncols=1, sharex=True)
ax1.plot(t,s1)
ax2.plot(t[:150],s2[:150])
ax3.plot(t[30:],s3[30:])
plt.tight_layout()
plt.show()
现在 x 轴在子图之间对齐,但所有子图的大小相同(这不是我想要的)
此外,我希望子图在 x 轴上接触,如下所示:
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s1 = np.sin(2*np.pi*t)
s2 = np.exp(-t)
s3 = s1*s2
fig1 = plt.figure()
plt.subplots_adjust(hspace=0)
ax1 = plt.subplot(311)
ax2 = plt.subplot(312, sharex=ax1)
ax3 = plt.subplot(313, sharex=ax1)
ax1.plot(t,s1)
ax2.plot(t[:150],s2[:150])
ax3.plot(t[30:],s3[30:])
xticklabels = ax1.get_xticklabels()+ax2.get_xticklabels()
plt.setp(xticklabels, visible=False)
plt.show()
因此,重新表述我的问题:
我想用
plt.subplot2grid(..., colspan=3, rowspan=2)
plt.subplots(..., sharex=True)
plt.subplots_adjust(hspace=0)
and
plt.tight_layout()
一起在同一个图中。怎么做?