Controlando Programaticamente o Ajuste de Subplots

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Matplotlib é uma biblioteca poderosa para criar visualizações em Python. Às vezes, ao criar gráficos, pode ser necessário ajustar os parâmetros dos subplots manualmente. Este laboratório mostrará como ajustar programaticamente os parâmetros dos subplots com base no tamanho dos rótulos.

Dicas da VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook para 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 às limitações do 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ê.

Importar as bibliotecas necessárias

Precisaremos de matplotlib.pyplot e matplotlib.transforms para criar o gráfico e manipular os parâmetros dos subplots.

import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

Criar o gráfico

Vamos criar um gráfico de linha simples com alguns rótulos y longos.

fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_yticks([2, 5, 7], labels=['really, really, really', 'long', 'labels'])

Definir a função de retorno de chamada (callback) de desenho

Vamos definir uma função que será chamada toda vez que o gráfico for desenhado. Esta função calculará as caixas delimitadoras (bounding boxes) dos rótulos y, determinará se o subplot deixa espaço suficiente para os rótulos e ajustará os parâmetros do subplot, se necessário.

def on_draw(event):
    bboxes = []
    for label in ax.get_yticklabels():
        ## Bounding box in pixels
        bbox_px = label.get_window_extent()
        ## Transform to relative figure coordinates. This is the inverse of
        ## transFigure.
        bbox_fig = bbox_px.transformed(fig.transFigure.inverted())
        bboxes.append(bbox_fig)
    ## the bbox that bounds all the bboxes, again in relative figure coords
    bbox = mtransforms.Bbox.union(bboxes)
    if fig.subplotpars.left < bbox.width:
        ## Move the subplot left edge more to the right
        fig.subplots_adjust(left=1.1*bbox.width)  ## pad a little
        fig.canvas.draw()

Conectar o evento de desenho à função de retorno de chamada

Precisamos conectar o draw_event à nossa função on_draw.

fig.canvas.mpl_connect('draw_event', on_draw)

Mostrar o gráfico

Finalmente, mostraremos o gráfico.

plt.show()

Resumo

Neste laboratório, aprendemos como ajustar programaticamente os parâmetros dos subplots com base no tamanho dos rótulos. Usamos o módulo matplotlib.transforms para calcular as bounding boxes (caixas delimitadoras) dos rótulos e o draw_event para chamar nossa função on_draw.