Introdução
Matplotlib é uma biblioteca de visualização de dados em Python. A funcionalidade .inset_locator permite a fácil colocação de insets (janelas internas) nos cantos dos eixos. Neste laboratório, exploraremos como usar a funcionalidade .inset_locator para criar insets em gráficos Matplotlib.
Dicas para a VM
Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.
Criar uma Figura com Dois Subplots
Primeiramente, precisamos criar uma figura com dois subplots (subgráficos). Usaremos o método plt.subplots() para criar uma figura com dois subplots lado a lado.
import matplotlib.pyplot as plt
fig, (ax, ax2) = plt.subplots(1, 2, figsize=[5.5, 2.8])
Criar Eixos de Inset
Em seguida, criaremos eixos de inset (janelas internas) em cada um dos subplots. Usaremos o método inset_axes() para criar os eixos de inset. Criaremos quatro insets com diferentes tamanhos e localizações.
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
## Criar inset com largura de 1.3 polegadas e altura de 0.9 polegadas
## na localização padrão superior direita
axins = inset_axes(ax, width=1.3, height=0.9)
## Criar inset com largura de 30% e altura de 40% da caixa delimitadora dos eixos pai
## no canto inferior esquerdo (loc=3)
axins2 = inset_axes(ax, width="30%", height="40%", loc=3)
## Criar inset com especificações mistas no segundo subplot;
## a largura é 30% da caixa delimitadora dos eixos pai e
## a altura é 1 polegada no canto superior esquerdo (loc=2)
axins3 = inset_axes(ax2, width="30%", height=1., loc=2)
## Criar um inset no canto inferior direito (loc=4) com borderpad=1, ou seja,
## preenchimento de 10 pontos (pois 10pt é o tamanho de fonte padrão) para os eixos pai
axins4 = inset_axes(ax2, width="20%", height="20%", loc=4, borderpad=1)
Desativar os Rótulos de Marcação (Tick Labels)
Para remover os rótulos de marcação de cada um dos insets, podemos usar o método tick_params() e definir labelleft e labelbottom como False.
## Desativar os ticklabels dos insets
for axi in [axins, axins2, axins3, axins4]:
axi.tick_params(labelleft=False, labelbottom=False)
Controlar a Posição e o Tamanho do Inset
Podemos usar os parâmetros bbox_to_anchor e bbox_transform para controlar a posição e o tamanho do inset. Estes parâmetros permitem um controle preciso sobre a posição e o tamanho do inset ou até mesmo posicionar o inset em posições completamente arbitrárias.
## Usamos a transformação dos eixos como bbox_transform. Portanto, a caixa delimitadora
## precisa ser especificada em coordenadas dos eixos ((0, 0) é o canto inferior esquerdo
## dos eixos, (1, 1) é o canto superior direito).
## A caixa delimitadora (.2, .4, .6, .5) começa em (.2, .4) e se estende até (.8, .9)
## nessas coordenadas.
## Dentro desta caixa delimitadora, um inset com metade da largura da caixa delimitadora e
## três quartos da altura da caixa delimitadora é criado. O canto inferior esquerdo
## do inset é alinhado ao canto inferior esquerdo da caixa delimitadora (loc=3).
## O inset é então deslocado pelo padrão de 0.5 em unidades do tamanho da fonte.
axins = inset_axes(ax, width="50%", height="75%",
bbox_to_anchor=(.2, .4, .6, .5),
bbox_transform=ax.transAxes, loc=3)
Criar Insets com Posições Arbitrárias
Podemos criar insets com posições arbitrárias usando o parâmetro bbox_to_anchor para especificar uma caixa delimitadora em coordenadas de dados e usando o parâmetro bbox_transform para especificar a transformação para a caixa delimitadora.
## Criar inset em coordenadas de dados usando ax.transData como transformação
axins3 = inset_axes(ax2, width="100%", height="100%",
bbox_to_anchor=(1e-2, 2, 1e3, 3),
bbox_transform=ax2.transData, loc=2, borderpad=0)
Criar um Inset Fora dos Eixos
Podemos criar um inset fora dos eixos usando o parâmetro bbox_to_anchor para especificar uma caixa delimitadora em coordenadas dos eixos que se estende para fora dos eixos.
## Criar um inset fora dos eixos
axins = inset_axes(ax, width="100%", height="100%",
bbox_to_anchor=(1.05, .6, .5, .4),
bbox_transform=ax.transAxes, loc=2, borderpad=0)
Criar um Inset com uma Caixa Delimitadora de 2-Tuplas
Podemos criar um inset com uma caixa delimitadora de 2-tuplas especificando a largura e a altura em polegadas e usando o parâmetro bbox_to_anchor para especificar o canto inferior esquerdo do inset.
## Criar um inset com uma caixa delimitadora de 2-tuplas. Note que isso cria uma
## bbox sem extensão. Portanto, isso só faz sentido ao especificar
## largura e altura em unidades absolutas (polegadas).
axins2 = inset_axes(ax, width=0.5, height=0.4,
bbox_to_anchor=(0.33, 0.25),
bbox_transform=ax.transAxes, loc=3, borderpad=0)
Criar um Inset Centrado em Coordenadas da Figura
Podemos criar um inset que é centralizado horizontalmente em coordenadas da figura e verticalmente limitado para se alinhar com os eixos usando o método blended_transform_factory() para criar uma transformação combinada e usá-la como o parâmetro bbox_transform.
## Criar um inset centralizado horizontalmente em coordenadas da figura e verticalmente
## limitado para se alinhar com os eixos.
from matplotlib.transforms import blended_transform_factory
transform = blended_transform_factory(fig.transFigure, ax2.transAxes)
axins4 = inset_axes(ax2, width="16%", height="34%",
bbox_to_anchor=(0, 0, 1, 1),
bbox_transform=transform, loc=8, borderpad=0)
Resumo
Neste laboratório, aprendemos como usar o recurso .inset_locator em Matplotlib para criar insets em gráficos. Criamos insets com diferentes tamanhos e localizações, controlamos a posição e o tamanho do inset, e criamos insets com posições arbitrárias. Também criamos insets fora dos eixos, insets com caixas delimitadoras de 2-tuplas e insets centralizados em coordenadas da figura.