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:
[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:
[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:
[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:
[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:
[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:
[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:
[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.