Matplotlib Fill Between

Beginner

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

Introdução

Matplotlib é uma biblioteca de visualização de dados na linguagem de programação Python. É utilizada para criar visualizações estáticas, animadas e interativas em Python. Neste laboratório, você aprenderá como usar a função fill_between do Matplotlib para preencher a área entre duas linhas.

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ê.

Uso Básico

A função fill_between pode ser usada para preencher a área entre duas linhas. Os parâmetros y1 e y2 podem ser escalares, indicando um limite horizontal nos valores y fornecidos. Se apenas y1 for fornecido, y2 assume o valor padrão de 0.

x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2 * np.pi * x)
y2 = 0.8 * np.sin(4 * np.pi * x)

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(6, 6))

ax1.fill_between(x, y1)
ax1.set_title('fill between y1 and 0')

ax2.fill_between(x, y1, 1)
ax2.set_title('fill between y1 and 1')

ax3.fill_between(x, y1, y2)
ax3.set_title('fill between y1 and y2')
ax3.set_xlabel('x')
fig.tight_layout()

Bandas de Confiança

Uma aplicação comum para fill_between é a indicação de bandas de confiança (confidence bands). fill_between usa as cores do ciclo de cores como a cor de preenchimento. Portanto, é frequentemente uma boa prática clarear a cor tornando a área semi-transparente usando alpha.

N = 21
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1,  9.9, 13.9, 15.1, 12.5]

## fit a linear curve and estimate its y-values and their error.
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +
                          (x - x.mean())**2 / np.sum((x - x.mean())**2))

fig, ax = plt.subplots()
ax.plot(x, y_est, '-')
ax.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax.plot(x, y, 'o', color='tab:brown')

Preenchimento Seletivo de Regiões Horizontais

O parâmetro where permite especificar os intervalos de x a serem preenchidos. É uma matriz booleana com o mesmo tamanho de x. Apenas os intervalos de x de sequências True contíguas são preenchidos. Como resultado, o intervalo entre valores True e False vizinhos nunca é preenchido. Portanto, é recomendado definir interpolate=True, a menos que a distância x dos pontos de dados seja suficientemente fina para que o efeito acima não seja perceptível.

x = np.array([0, 1, 2, 3])
y1 = np.array([0.8, 0.8, 0.2, 0.2])
y2 = np.array([0, 0, 1, 1])

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

ax1.set_title('interpolation=False')
ax1.plot(x, y1, 'o--')
ax1.plot(x, y2, 'o--')
ax1.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3)
ax1.fill_between(x, y1, y2, where=(y1 < y2), color='C1', alpha=0.3)

ax2.set_title('interpolation=True')
ax2.plot(x, y1, 'o--')
ax2.plot(x, y2, 'o--')
ax2.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3,
                 interpolate=True)
ax2.fill_between(x, y1, y2, where=(y1 <= y2), color='C1', alpha=0.3,
                 interpolate=True)
fig.tight_layout()

Marcação Seletiva de Regiões Horizontais em Todos os Eixos

O mesmo mecanismo de seleção pode ser aplicado para preencher a altura vertical total dos eixos. Para ser independente dos limites de y, adicionamos uma transformação (transform) que interpreta os valores de x em coordenadas de dados e os valores de y em coordenadas de eixos. O exemplo a seguir marca as regiões em que os dados de y estão acima de um determinado limite (threshold).

fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')

threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
                color='green', alpha=0.5, transform=ax.get_xaxis_transform())

Resumo

Neste laboratório, você aprendeu como usar a função fill_between do Matplotlib para preencher a área entre duas linhas. Você também aprendeu como preencher seletivamente regiões horizontais e marcar regiões horizontais em todos os eixos.