Skip to content
Tutoriais
Matplotlib
How to Easily Handle Fill_between in Matplotlib

Como lidar facilmente com fill_between no Matplotlib

A visualização de dados é tão artística quanto científica. Uma das ferramentas mais poderosas no arsenal de um cientista de dados é o Matplotlib, uma biblioteca versátil do Python que oferece uma base sólida para criar uma ampla variedade de gráficos, plots e visualizações de dados mais complexas. Entre sua ampla gama de recursos, um se destaca por sua capacidade única de destacar áreas de importância dentro de um gráfico - a função fill_between.

A função fill_between pode ser usada para preencher a área entre duas linhas, mas suas capacidades vão além de preenchimentos simples. Com um pouco de criatividade, ela pode ser utilizada para criar preenchimentos condicionais que destacam períodos ou padrões específicos em seus dados. Este artigo visa oferecer uma explicação rica e detalhada sobre como aproveitar o poder do fill_between, aprimorando seus gráficos do Matplotlib e superando os melhores recursos disponíveis.

Por que fill_between importa no Matplotlib

A habilidade de preencher áreas entre linhas em um gráfico proporciona um destaque visual que pode enfatizar diferenças, tendências ou padrões dentro de seus dados. Isso pode ser fundamental para destacar áreas-chave, guiando a atenção do espectador para pontos de dados significativos ou simplesmente adicionando um toque estético aos seus gráficos. Quando combinado com declarações condicionais, ele pode atingir um novo nível de utilidade, permitindo destaques mais sutis e específicos em seus dados.

Preenchendo entre Linhas: O Básico

Antes de mergulhar no preenchimento condicional, vamos entender como o fill_between funciona em um nível básico. A função recebe pelo menos três argumentos:

  1. Os valores x: Estes definem os limites horizontais do preenchimento.
  2. Os primeiros valores y: Estes definem o limite vertical inferior.
  3. Os segundos valores y: Estes definem o limite vertical superior.

Aqui está um exemplo simples:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
 
plt.plot(x, y1, '-b', label='seno')
plt.plot(x, y2, '-r', label='cosseno')
plt.fill_between(x, y1, y2, color='cinza', alpha=0.5)
plt.show()

Neste exemplo, a área entre as funções seno e cosseno é preenchida com uma cor cinza.

Introduzindo Preenchimentos Condicionais com where

A função fill_between também pode aceitar um argumento where. Este argumento permite que você especifique uma condição booleana, na qual o preenchimento será aplicado. Em outras palavras, o preenchimento só acontecerá quando esta condição for True.

Agora, vamos usar um exemplo simples com um DataFrame para ilustrar isso. Suponha que temos um DataFrame df com as colunas A e B, e queremos preencher entre essas duas linhas:

plt.fill_between(df.index, df['A'], df['B'], where=(df['A'] > df['B']), color='cinza', alpha=0.5)

Isso preenche a área entre A e B apenas quando A é maior que B.

O Problema: Preenchimento Condicional Entre Valores de Índice Específicos

Ao tentar usar o fill_between com uma condição envolvendo valores de índice específicos, você pode encontrar um erro comum. Isso é bem ilustrado por uma pergunta feita por um usuário que desejava preencher a área entre duas linhas, mas apenas para os meses específicos: 'January', 'February' e 'March'. Suas tentativas iniciais resultaram em um ValueError ou nenhum preenchimento.

Vamos entender esse problema, entender a causa raiz e fornecer uma solução infalível, logo após a pausa.

Entendendo a Causa Raiz do Erro

Continuando de onde paramos, o usuário tentou preencher entre duas linhas de um DataFrame, com uma condição nos valores de índice. Especificamente, eles queriam aplicar o preenchimento apenas aos meses de 'January', 'February' e 'March'. No entanto, eles encontraram um problema.

O ValueError que receberam ao tentar usar a palavra-chave in com um array e uma lista aconteceu porque a palavra-chave in do Python verifica se um elemento está em um iterável. Mas neste caso, ela estava sendo usada para verificar se um array, que não é um iterável, está em uma lista. Essa operação é ambígua e, portanto, gera um erro.

A razão pela qual a segunda tentativa deles (onde eles converteram o índice para uma lista e usaram a palavra-chave in) não resultou em nenhum preenchimento é porque a operação in ainda não estava sendo vetorizada, ou seja, aplicada elemento por elemento.

A Solução: Vetorizando a Condição com isin()

Um conceito-chave no pandas, a vetorização envolve a realização de operações em arrays inteiros em vez de elementos individuais. Para preencher entre linhas condicionalmente com base em valores de índice específicos, precisamos vetorizar a condição usando o método .isin() embutido no pandas. Este método verifica cada elemento do índice do DataFrame em relação a uma lista e retorna uma série booleana.

A solução correta para o problema do usuário seria, portanto:

ax.fill_between(x = plotMonths.index,
                y1 = plotMonths['ro laws'],
                y2 = plotMonths['ro ordos'],
                where = plotMonths.index.isin(['January', "February", 'March']),
                facecolor = 'lightskyblue',
                alpha = 0.2)

Aqui, where = plotMonths.index.isin(['January', "February", 'March']) verifica cada elemento de plotMonths.index em relação à lista ['January', "February", 'March'] e retorna uma série booleana. Esta série é usada para preencher condicionalmente entre as linhas 'ro laws' e 'ro ordos'.

Alternativa ao Matplotlib: Visualize Dados com PyGWalker

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

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

Não é mais necessário realizar processamentos complicados com código 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:

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

O PyGWalker é desenvolvido com o apoio de nossa comunidade de código aberto. Não se esqueça de acessar PyGWalker GitHub (opens in a new tab) e nos dar uma estrela!

Conclusão

A função fill_between do Matplotlib oferece recursos poderosos para adicionar ênfase visual aos seus gráficos. Ela permite o preenchimento entre linhas e, com o uso do argumento where, também pode realizar preenchimentos condicionais. Entender esses recursos e seus princípios subjacentes é essencial para uma visualização de dados eficaz.

Perguntas frequentes

Ao longo deste artigo, exploramos a função fill_between, seus usos e sua implementação. Aqui estão algumas perguntas frequentes para resumir e reforçar os pontos-chave:

Q1: O que é a função fill_between no Matplotlib?

A função fill_between é usada para preencher a área entre duas linhas em um gráfico. É uma ferramenta poderosa para destacar diferenças, tendências ou padrões nos dados.

Q2: Como posso preencher entre linhas condicionalmente no Matplotlib?

Você pode usar o argumento where na função fill_between para preencher entre linhas com base em uma condição. Essa condição deve ser uma série booleana com o mesmo índice dos seus valores de x.

Q3: Por que recebo um ValueError ao usar fill_between com uma condição em valores de índice específicos?

Esse erro ocorre quando a palavra-chave in do Python é usada para verificar se um array está em uma lista. Para resolver isso, você pode usar o método .isin() do pandas, que verifica cada elemento do índice do DataFrame em relação a uma lista e retorna uma série booleana.