2016-01-21 2 views
12

Я пытаюсь создать фигуру, состоящую из сетки 2x2, где в каждом квадранте есть 2 вертикально уложенных поднабора (т. Е. Сетка 2x1). Однако я не могу понять, как этого добиться.Matplotlib - добавление подзаголовков в подзаголовок?

Самый близкий я получил использование gridspec и некоторого уродливого кода (см. Ниже), но поскольку gridspec.update(hspace=X) изменяет интервал для всех подзаговоров, я все еще не там, где хотел бы быть.

В идеале, я хотел бы, используя приведенный ниже снимок, уменьшить расстояние между подзаголовками в каждом квадранте, увеличивая вертикальное расстояние между верхним и нижним квадрантами (т.е. между 1-3 и 2-4).

Есть ли способ сделать это (с использованием или без использования gridspec)? Первоначально я представлял собой создание каждой из подсетей-сеток (т. Е. Каждую сетку 2x1) и вставляя их в большую сетку 2x2 подзаголовков, но я не понял, как добавить подзаговор в подзаголовок, если есть даже далеко.

enter image description here

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
plt.figure(figsize=(10, 8)) 
gs = gridspec.GridSpec(4,2) 
gs.update(hspace=0.4) 
for i in range(2): 
    for j in range(4): 
     ax = plt.subplot(gs[j,i]) 
     ax.spines['top'].set_visible(False) 
     ax.spines['right'].set_visible(False) 
     plt.tick_params(which='both', top='off', right='off') 
     if j % 2 == 0: 
      ax.set_title(str(i+j+1)) 
      ax.plot([1,2,3], [1,2,3]) 
      ax.spines['bottom'].set_visible(False) 
      ax.get_xaxis().set_visible(False) 
     else: 
      ax.plot([1,2,3], [3,2,1]) 

ответ

18

Вы можете nest your GridSpec using SubplotSpec. Внешняя сетка будет 2 x 2, а внутренние сетки будут 2 x 1. Следующий код должен дать вам основную идею.

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure(figsize=(10, 8)) 
outer = gridspec.GridSpec(2, 2, wspace=0.2, hspace=0.2) 

for i in range(4): 
    inner = gridspec.GridSpecFromSubplotSpec(2, 1, 
        subplot_spec=outer[i], wspace=0.1, hspace=0.1) 

    for j in range(2): 
     ax = plt.Subplot(fig, inner[j]) 
     t = ax.text(0.5,0.5, 'outer=%d, inner=%d' % (i,j)) 
     t.set_ha('center') 
     ax.set_xticks([]) 
     ax.set_yticks([]) 
     fig.add_subplot(ax) 

fig.show() 

enter image description here

+0

идеально подходит, спасибо :) – user3014097

Смежные вопросы