Até agora temos usado a criação implícita de figura e de eixos. Pode-se ter mais controle sobre a exibição usando figura, subplotagens e os eixos de forma explícita. A figura em matplotlib significa toda a janela na interface do usuário. Dentro dessa figura, pode haver subplotagens. Enquanto o subplot posiciona as parcelas em uma grade regular, os eixos permitem a colocação livre dentro da figura. Ambos podem ser úteis, dependendo da sua intenção. Nós já trabalhamos com figuras e subplotagens sem chamá-los explicitamente. Quando chamamos o plot, o matplotlib chama o gca() para obter os eixos atuais e gca por sua vez chama o gcf() para obter a figura atual. Se não há nenhuma ele chama figura() para fazer uma, estritamente falando, para fazer um subplot (111). Vamos ver os detalhes.

Figuras

A figura são as janelas do GUI que  tem “Figure #” como título. As figuras são numerados começando a partir de 1, em oposição à forma normal do python que é a partir de 0. Isto é claramente estilo MATLAB. Existem vários parâmetros que determinam como a figura aparece:

Argumento Padrão Descrição
num 1 número da figura
figsize figure.figsize tamanho da figura em polegadas (largura, altura)
dpi figure.dpi resolução em pontos por polegada
facecolor figure.facecolor cor do fundo
edgecolor figure.edgecolor cor da borda no entorno do fundo
frameon True desenhar o quadro da figura ou não

Os padrões podem ser especificados no arquivo de recurso e serão usado a maior parte do tempo. Apenas o número da figura é frequentemente mudado.

Quando você trabalha com o GUI, você pode fechar a figura, clicando no x no canto superior direito. Mas você pode fechar uma figura programamente, chamando o close. Dependendo do argumento ele fecha (1) a figura atual (sem argumento), (2) uma figura específica (número da figura ou instância como argumento), ou (3) todas as figuras (all como argumento).

Tal como acontece com outros objetos, você pode definir propriedades da figura.

Subplotagens

Com subplot você pode organizar plotagens em uma grade regular. Você precisa especificar o número de linhas e colunas e o número da plotagem. Note que o comando gridspec é uma alternativa mais poderosa.

Em duas linhas:

plot_subplot-horizontal_1 

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

pl.figure(figsize=(6, 4))
pl.subplot(2, 1, 1)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(2,1,1)', ha='center', va='center',
        size=24, alpha=.5)

pl.subplot(2, 1, 2)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(2,1,2)', ha='center', va='center',
        size=24, alpha=.5)

pl.tight_layout()
pl.show()

[/pastacode]

Em duas colunas:

plot_subplot-vertical_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

pl.figure(figsize=(6, 4))
pl.subplot(1, 2, 1)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(1,2,1)', ha='center', va='center',
        size=24, alpha=.5)

pl.subplot(1, 2, 2)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(1,2,2)', ha='center', va='center',
        size=24, alpha=.5)

pl.tight_layout()
pl.show()

[/pastacode]

 Em duas linhas e duas colunas:

plot_subplot-grid_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

pl.figure(figsize=(6, 4))
pl.subplot(2, 2, 1)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(2,2,1)', ha='center', va='center',
        size=20, alpha=.5)

pl.subplot(2, 2, 2)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(2,2,2)', ha='center', va='center',
        size=20, alpha=.5)

pl.subplot(2, 2, 3)
pl.xticks(())
pl.yticks(())

pl.text(0.5, 0.5, 'subplot(2,2,3)', ha='center', va='center',
        size=20, alpha=.5)

pl.subplot(2, 2, 4)
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'subplot(2,2,4)', ha='center', va='center',
        size=20, alpha=.5)

pl.tight_layout()
pl.show()

[/pastacode]

 Usando o gridspec:

plot_gridspec_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

import matplotlib.gridspec as gridspec

pl.figure(figsize=(6, 4))
G = gridspec.GridSpec(3, 3)

axes_1 = pl.subplot(G[0, :])
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'Axes 1', ha='center', va='center', size=24, alpha=.5)

axes_2 = pl.subplot(G[1, :-1])
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'Axes 2', ha='center', va='center', size=24, alpha=.5)

axes_3 = pl.subplot(G[1:, -1])
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'Axes 3', ha='center', va='center', size=24, alpha=.5)

axes_4 = pl.subplot(G[-1, 0])
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'Axes 4', ha='center', va='center', size=24, alpha=.5)

axes_5 = pl.subplot(G[-1, -2])
pl.xticks(())
pl.yticks(())
pl.text(0.5, 0.5, 'Axes 5', ha='center', va='center', size=24, alpha=.5)

pl.tight_layout()
pl.show()

[/pastacode]

Eixos

Axes são muito semelhantes aos subplots, mas permitem a colocação de plotagens em qualquer local na figura. Portanto, se queremos colocar um gráfico menor dentro de um maior, fazemos isso com eixos.

Menor dentro de um maior:

plot_axes_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

pl.axes([.1, .1, .8, .8])
pl.xticks(())
pl.yticks(())
pl.text(.6, .6, 'axes([0.1,0.1,.8,.8])', ha='center', va='center',
        size=20, alpha=.5)

pl.axes([.2, .2, .3, .3])
pl.xticks(())
pl.yticks(())
pl.text(.5, .5, 'axes([0.2,0.2,.3,.3])', ha='center', va='center',
        size=16, alpha=.5)

pl.show()

[/pastacode]

Em fichas:

plot_axes-2_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

pl.axes([.1, .1, .5, .5])
pl.xticks(())
pl.yticks(())
pl.text(0.1, 0.1, 'axes([0.1,0.1,.8,.8])', ha='left', va='center',
        size=16, alpha=.5)

pl.axes([.2, .2, .5, .5])
pl.xticks(())
pl.yticks(())
pl.text(0.1, 0.1, 'axes([0.2,0.2,.5,.5])', ha='left', va='center',
        size=16, alpha=.5)

pl.axes([0.3, 0.3, .5, .5])
pl.xticks(())
pl.yticks(())
pl.text(0.1, 0.1, 'axes([0.3,0.3,.5,.5])', ha='left', va='center',
        size=16, alpha=.5)

pl.axes([.4, .4, .5, .5])
pl.xticks(())
pl.yticks(())
pl.text(0.1, 0.1, 'axes([0.4,0.4,.5,.5])', ha='left', va='center',
        size=16, alpha=.5)

pl.show()

[/pastacode]

Marcadores

Marcadores bem formatados são uma parte importante de figuras prontas para publicação. O Matplotlib oferece um sistema totalmente configurável para marcadores. Há localizadores de marcadores para especificar onde os marcadores devem aparecer e formatadores de marcadores para dar a aparência que você quiser. Marcadores pequenos e grandes podem estar localizados e formatados de forma independente um do outro. Por padrão marcadores menores não são mostrados (veja abaixo).

Localizadores de Marcadores

Os localizadores dos marcadores controlam as posições dos marcadores. Eles são definidos como:

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

ax = pl.gca()
ax.xaxis.set_major_locator(eval(locator))

[/pastacode]

Existem vários localizadores para diferentes tipos de requerimentos, por exemplo:

plot_ticks_1[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

import numpy as np

def tickline():
    pl.xlim(0, 10), pl.ylim(-1, 1), pl.yticks([])
    ax = pl.gca()
    ax.spines['right'].set_color('none')
    ax.spines['left'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('none')
    ax.xaxis.set_minor_locator(pl.MultipleLocator(0.1))
    ax.plot(np.arange(11), np.zeros(11), color='none')
    return ax

locators = [
                'pl.NullLocator()',
                'pl.MultipleLocator(1.0)',
                'pl.FixedLocator([0, 2, 8, 9, 10])',
                'pl.IndexLocator(3, 1)',
                'pl.LinearLocator(5)',
                'pl.LogLocator(2, [1.0])',
                'pl.AutoLocator()',
            ]

n_locators = len(locators)

size = 512, 40 * n_locators
dpi = 72.0
figsize = size[0] / float(dpi), size[1] / float(dpi)
fig = pl.figure(figsize=figsize, dpi=dpi)
fig.patch.set_alpha(0)

for i, locator in enumerate(locators):
    pl.subplot(n_locators, 1, i + 1)
    ax = tickline()
    ax.xaxis.set_major_locator(eval(locator))
    pl.text(5, 0.3, locator[3:], ha='center')

pl.subplots_adjust(bottom=.01, top=.99, left=.01, right=.99)
pl.show()

[/pastacode]

Todos esses localizadores são derivados da classe base matplotlib.ticker.Locatos. Você pode fazer seu prórpio localizador derivando dessa classe. Manipilando datas como marcadores pode ser especialmente complicado. No entanto, o matplotlib oferece localizadores especiais no matplotlib.dates.