Skip to content

Corrigindo o problema do savefig do Matplotlib que corta as legendas: Um guia abrangente

Updated on

Você passou horas criando o gráfico perfeito no Matplotlib, apenas para descobrir que as legendas são cortadas quando você tenta salvá-lo usando a função savefig. Isso pode ser bastante frustrante, especialmente quando seu xlabel tem a altura equivalente a algumas linhas de texto e simplesmente não é exibido corretamente. Mas não se preocupe, você chegou ao lugar certo. Neste artigo, exploraremos diversos métodos para corrigir o problema em que a função savefig do Matplotlib corta as legendas.

Entendendo o problema

Antes de começarmos a resolver o problema, vamos primeiro entender por que ele ocorre. É comum usar legendas complexas em gráficos científicos ou matemáticos, que muitas vezes são renderizadas usando fórmulas TeX. Essas legendas podem ser "altas", ou seja, podem ocupar várias linhas, fazendo com que a parte inferior da legenda seja cortada na figura salva. Aqui está um exemplo desse caso:

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Exemplo com o matplotlib 3.4.2\nMRE não é mais um problema')
plt.show()

Neste exemplo, o ylabel é visível, mas o xlabel é cortado na parte inferior.

O método subplots_adjust

Uma solução comum para esse problema envolve ajustar as margens do gráfico usando a função subplots_adjust. A função subplots_adjust pode ser aplicada tanto à figura atual obtida por meio de plt.gcf() quanto diretamente ao gráfico usando plt.subplots_adjust(). Veja como usá-la:

plt.gcf().subplots_adjust(bottom=0.15)
# ou
plt.subplots_adjust(bottom=0.15)

Esse método ajusta a margem inferior para criar espaço para o xlabel.

O método tight_layout

O Matplotlib introduziu a função tight_layout, que ajusta automaticamente os parâmetros dos subgráficos para fornecer um espaçamento especificado. Essa função é ótima, pois oferece uma solução adequada para o problema de legendas cortadas:

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
axes = axes.flatten()
 
for ax in axes:
    ax.set_ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
    ax.set_xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$')
 
plt.tight_layout()
plt.show()

Ao chamar plt.tight_layout(), o Matplotlib ajusta automaticamente os eixos dos subgráficos, garantindo que as legendas não se sobreponham e não sejam cortadas.

Salvando a figura com bbox_inches='tight'

Outra maneira de garantir que as legendas não sejam cortadas ao salvar a figura é especificar bbox_inches='tight' na função savefig:

plt.savefig('myfile.png', bbox_inches="tight")

Essa opção garante que todos os elementos do gráfico, incluindo as legendas, sejam ajustados dentro da caixa delimitadora ao salvar o gráfico.

Na próxima seção, mergulharemos mais fundo nas configurações de layout automático da figura e veremos como elas podem ser usadas para corrigir nosso problema.

Ajustes Automáticos de Layout

O Matplotlib oferece uma opção para ajustar automaticamente o layout de seus gráficos. Isso é particularmente útil quando você deseja que seu código produza gráficos consistentes em máquinas com configurações diferentes. Veja como você pode configurar isso:

Atualizando rcParams durante a execução

Você pode atualizar o rcParams durante a execução. Isso permite que você garanta que a configuração de ajuste automático do layout esteja habilitada quando seu código for executado. Veja como fazer isso:

from matplotlib import rcParams
rcParams.update({'figure.autolayout': True})

Configurando o arquivo Matplotlibrc

Alternativamente, você pode definir o ajuste automático do layout diretamente em seu arquivo matplotlibrc:

figure.autolayout: True

Essa configuração é uma ótima maneira de garantir consistência em seus gráficos em máquinas e ambientes diferentes.

Agora você deve ter uma boa compreensão de como resolver o problema em que a função savefig do Matplotlib corta as legendas. Lembre-se de que a melhor solução dependerá de suas necessidades e circunstâncias específicas, portanto, não tenha medo de experimentar esses métodos para encontrar aquele que funciona melhor para você.

Alternativa ao Matplotlib: Visualize os Dados com o PyGWalker

Além de usar o Matplotlib para visualizar seu dataframe do pandas, aqui está uma alternativa, uma biblioteca Python de código aberto que pode ajudar você a criar visualizações de dados com facilidade: PyGWalker (opens in a new tab).

PyGWalker para visualização de dados (opens in a new tab)

Não é mais necessário realizar processamentos complicados com codificação em Python, basta importar seus dados e arrastar e soltar as variáveis para criar todos os tipos de visualizações de dados! Aqui está um vídeo de demonstração rápida sobre a operação:


Veja como usar o PyGWalker em seu Jupyter Notebook:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Alternativamente, você pode experimentá-lo no Kaggle Notebook/Google Colab:

Execute o PyGWalker no Kaggle Notebook (opens in a new tab)Execute o PyGWalker no Google Colab (opens in a new tab)Dê uma ⭐️ para o PyGWalker no GitHub (opens in a new tab)
Execute o PyGWalker no Kaggle Notebook (opens in a new tab)Execute o PyGWalker no Google Colab (opens in a new tab)Execute o PyGWalker no Google Colab (opens in a new tab)

PyGWalker é construído com a ajuda da nossa comunidade Open Source. Não se esqueça de conferir PyGWalker GitHub (opens in a new tab) e nos dar uma estrela!

Perguntas Frequentes

  1. Por que as minhas legendas estão sendo cortadas quando eu uso a função savefig no Matplotlib? Isso acontece frequentemente quando as suas legendas são "altas", como quando elas são renderizadas usando fórmulas TeX e abrangem várias linhas. O Matplotlib não ajusta automaticamente as margens do gráfico para acomodar essas legendas, resultando no corte delas.

  2. O que é a função tight_layout no Matplotlib? A função tight_layout é um recurso do Matplotlib que ajusta automaticamente os parâmetros do subplot para dar um espaçamento específico. Ela garante que as legendas não se sobreponham e não sejam cortadas.

  3. O que faz o parâmetro bbox_inches='tight' na função savefig? A opção bbox_inches='tight' na função savefig garante que todos os elementos do gráfico, incluindo as legendas, sejam ajustados dentro da caixa delimitadora quando o gráfico é salvo. Isso ajuda a evitar que as legendas sejam cortadas na figura salva.