Elementos auxiliares (Fill between)

5 minute read


O elemento do tipo Fill between preenche a área entre duas curvas horizontais. É um elemento muito útil para destacar diferenças entre duas condições, ou seja, dar ênfase a algum comportamento. Este elemento preenche com uma cor pré-definida tudo que estiver entre dois conjuntos de y.

Dessa forma, é necessário ter 2 linhas, uma com (x,y1) e outra (x,y2).

Conjunto de dados

Iremos utilizar o conjunto de dados do clima utilizado na aula de gráfico de linhas. Este conjunto de dados, tem a temperatura ambiente medida em dois dias diferentes (13/04/2021 e 29/04/2021) na cidade de Birigui-SP, em diversos horários. A ideia é utilizar o fill between para preencher a área entre os dois dias, para enfatizar a diferença.

Para relembrar, estes são os dados:

temperatura_13_04_2021 = [21, 19, 19, 18, 23, 27, 31, 33, 34, 28, 23, 26] # temperatura em °C
temperatura_29_04_2021 = [21, 19, 18, 15, 21, 26, 29, 30, 30, 24, 23, 21] # temperatura em °C
horario = ['00:00', '02:00', '04:00', '06:00', '08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00', '22:00']

E o gráfico (com poucas edições) é este:

plt.figure(figsize=(12,6))
plt.plot(horario, temperatura_13_04_2021, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.plot(horario, temperatura_29_04_2021, c='gray', marker="s", linewidth=1.5, label="29/04/2021")
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.ylim(14,36)
plt.legend(loc=2)    
plt.show()

Figura 1 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Preenchimento da área abaixo da curva

O elemento fill_between() requer pelo menos dois parâmetros, onde o primeiro (x) é uma sequência com os valores do eixo x, e o segundo (y1), que também é uma sequência (de mesmo tamanho que a sequência anterior), mas com os valores de y, e que define a primeira curva. Utilizando esta forma, a área será preenchida entre os valores passados para y1 e a reta y = 0.

Por exemplo, vamos preencher toda a área abaixo da curva obitida para os dados de temperatura medidos no dia 13/04/2021. Para isto, basta passar x = horario e y1 = temperatura_13_04_2021, da seguinte forma:

plt.figure(figsize=(12,6))
plt.plot(horario, temperatura_13_04_2021, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.fill_between(x=horario, y1=temperatura_13_04_2021)
plt.legend(loc=2)    
plt.show()

Figura 2 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Preenchimento entre duas curvas

Também é possível passar um terceiro parâmetro (y2), que também deve ser uma sequência (uma sequência com o mesmo número de elementos que a sequência anterior ou um número inteiro) com os valores da segunda linha, sendo o padrão y2 = 0 (que foi utilizado no tópico acima).

Por exemplo, para preencher a área entre os dois dias monitorados, basta passar o primeiro dia para o parâmetro y1, e o segundo dia para o parâmetro y2, da seguinte forma:

plt.figure(figsize=(12,6))
plt.plot(horario, temperatura_13_04_2021, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.fill_between(x=horario, y1=temperatura_13_04_2021, y2=temperatura_29_04_2021 )
plt.legend(loc=2)    
plt.show()

Figura 3 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Observe que, por padrão, o plt.fill_between() não desenha linhas. As linhas desenhadas são provenientes do plt.plot(). Observe o resultado caso não seja utilizado o plt.plot():

plt.figure(figsize=(12,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.fill_between(x=horario, y1=temperatura_13_04_2021, y2=temperatura_29_04_2021)
plt.show()

Figura 4 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Edições

O plt.fill_between() aceita uma série de parâmetros para a sua edição, sendo possível alterar a cor de preenchimento (color ou facecolor), inserir linhas (linestyle, linewidth, edgecolor), inserir estilos de preenchimento (hatch), adicionar transparência (alpha), determinar a ordem de plotagem (zorder), inserir nome para legenda (label), entre outros, de forma similar ao que temos feito até aqui.

Por exemplo:

plt.figure(figsize=(12,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.fill_between(x=horario, y1=temperatura_13_04_2021, y2=temperatura_29_04_2021, edgecolor="k", facecolor="salmon", label="Dirferença de temperatura")
plt.legend(loc=2)
plt.show()

Figura 5 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Outro exemplo:

plt.figure(figsize=(12,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP em diferentes dias do mês de abril/2021")
plt.fill_between(x=horario, y1=temperatura_13_04_2021, y2=temperatura_29_04_2021, edgecolor="k", facecolor="none", hatch = "//|", label="Dirferença de temperatura")
plt.legend(loc=2)
plt.show()

Figura 6 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Você encontra maiores detalhes na documentação.


Fill between x

Também temos a opção de utilizar o fill_between() entre duas curvas na direção do eixo x, ao invés da direção do eixo y. Para isto, utilizamos o fill_betweenx(), de forma muito similar ao fill_between().

A diferença é que precisamos passar os dados de y como primeiro parâmetro, e as curvas em x para os parâmetros x1 e x2, sendo que o parâmetro x2 é opcional (padrão x2=0).

Para exemplificar, vamos inverter os dados de x e y de temperatura. Ou seja:

plt.figure(figsize=(3,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP \n em diferentes dias do mês de abril/2021")
plt.plot(temperatura_13_04_2021, horario, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.plot(temperatura_29_04_2021, horario, c='gray', marker="s", linewidth=1.5, label="29/04/2021")
plt.legend(loc=4)
plt.xlabel("Temperatura ($°C$)")
plt.ylabel("Hora de monitoramento ($hora$)")
plt.show()

Figura 7 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes - invertido.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Para preencher entre os dados do dia 13/04/2021 e x=0, basta passar apenas os parâmetros y e x1 em plt.fill_betweenx():

plt.figure(figsize=(3,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP \n em diferentes dias do mês de abril/2021")
plt.plot(temperatura_13_04_2021, horario, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.fill_betweenx(y=horario, x1=temperatura_13_04_2021)
# plt.legend(loc=4)
plt.xlabel("Temperatura ($°C$)")
plt.ylabel("Hora de monitoramento ($hora$)")
plt.show()

Figura 8 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes - invertido.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


De forma similar, para preencher entre os dados dos dois dias onde as temperaturas foram observadas (duas curvas):

plt.figure(figsize=(3,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP \n em diferentes dias do mês de abril/2021")
plt.plot(temperatura_13_04_2021, horario, c='k', marker="o", linewidth=1.5, label="13/04/2021")
plt.fill_betweenx(y=horario, x1=temperatura_13_04_2021, x2=temperatura_29_04_2021)
plt.legend(loc=4)
plt.xlabel("Temperatura ($°C$)")
plt.ylabel("Hora de monitoramento ($hora$)")
plt.show()

Figura 9 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes - invertido.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Novamente, os pontos e as linhas são provenientes do plt.plot(). Caso ele seja removido, obtemos:

plt.figure(figsize=(3,6))
plt.title("Monitoramento da temperatura na cidade de Birigui-SP \n em diferentes dias do mês de abril/2021")
plt.fill_betweenx(y=horario, x1=temperatura_13_04_2021, x2=temperatura_29_04_2021)
# plt.legend(loc=4)
plt.xlabel("Temperatura ($°C$)")
plt.ylabel("Hora de monitoramento ($hora$)")
plt.show()

Figura 10 - Gráfico de dispersão com linhas para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes - invertido.

Gráfico de dispersão com linhas desenhado com o matplotlib para o monitoramento da temperatura na cidade de Birigui-SP em dias diferentes


Você encontra maiores detalhes na documentação.


Qual é a principal diferença entre o fill_between e o fill_betweenx?

O fill_betweenx preenche a área entre as curvas na direção do eixo x, enquanto que o fill_between preenche área entre as curvas na direção do eixo y.

O fill_betweenx preenche a área entre as curvas na direção do eixo y, enquanto que o fill_between preenche área entre as curvas na direção do eixo x.


Anterior Próximo

Updated: