Использование пространства, оставленного отсутствующей меткой, при использовании дочерних участков - PullRequest
1 голос
/ 20 июня 2019

Я прошу прощения за titlegore, но я не мог понять, как сформулировать это по-другому.Проблема лучше всего иллюстрируется рисунком ниже.Как вы можете видеть, я сделал рисунок, состоящий из 5 субплотов, используя matplotlibs gridspec, которые вписываются в 4 квадратных панели.Три пустые панели имеют свои собственные наборы координат х и требуют своей собственной метки.Однако данные с первых двух панелей имеют общую ось X, и (учитывая, что фактическая метка будет длинной), я бы предпочел иметь только одну метку и один набор меток для обеих, как показано здесь.

Но, как вы можете видеть, это оставляет довольно большой промежуток между двумя панелями, куда бы ушел ярлык.И это то, что я хотел бы решить;Я хотел бы растянуть две панели в равных количествах, чтобы заполнить это белое пространство.В то же время верхняя часть верхней панели и нижняя часть нижней панели должны по-прежнему совмещаться с участком справа, а нижняя часть обеих панелей не должна мешать расположению строки, которая находится ниже.Я изучил документацию по настройке панелей в документации , но не смог разобраться.

Кроме того, я хотел бы также иметь одну метку оси Y длядве панели, но я думаю, что могу выдумать это с fig.text().

enter image description here

Код, который генерирует вышеуказанный график:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import gridspec

xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)

fig = plt.figure(figsize=(7.2,4.45*1.5)) 
gs1 = gridspec.GridSpec(4, 2, figure=fig)
#gs1.update(hspace=0.1)
ax1 = plt.subplot(gs1[0, 0])
ax1.plot(xs, ys)
#ax1.set_xlabel('X')
ax1.set_ylabel('Y1')
ax1.set_xticks([])
ax2 = plt.subplot(gs1[1, 0])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)
gs2 = gridspec.GridSpec(4, 2)
ax3 = plt.subplot(gs2[0:2, 1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = plt.subplot(gs2[2:, 0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = plt.subplot(gs2[2:, 1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')
plt.tight_layout()

1 Ответ

1 голос
/ 20 июня 2019

Вы можете использовать SubplotSpec в одном из квадрантов сетки сетки 2x2.Пример находится в int gridspec-using-subplotspec .

Здесь это будет выглядеть так:

import numpy as np
from matplotlib import pyplot as plt

xs = np.linspace(0,8*np.pi,101)
ys = np.cos(xs)

fig = plt.figure(figsize=(7.2,4.45*1.5)) 
# 2x2 "outer" GridSpec
gs = fig.add_gridspec(2, 2)
# 2x1 "inner" GridSpec to be used 
# in one cell of the outer grid
gs00 = gs[0,0].subgridspec(2, 1)


ax1 = fig.add_subplot(gs00[0])
ax1.plot(xs, ys)
ax1.set_ylabel('Y1')
ax1.set_xticks([])

ax2 = fig.add_subplot(gs00[1])
ax2.plot(xs, 0.5*ys)
ax2.set_xlabel('X')
ax2.set_ylabel('Y2')
ax2.set_ylim(-1,1)

ax3 = fig.add_subplot(gs[0,1])
ax3.set_xlabel('X3')
ax3.set_ylabel('Y3')
ax4 = fig.add_subplot(gs[1,0])
ax4.set_xlabel('X4')
ax4.set_ylabel('Y4')
ax5 = fig.add_subplot(gs[1,1])
ax5.set_xlabel('X5')
ax5.set_ylabel('Y5')

fig.tight_layout()
plt.show()

enter image description here

...