Aspecto da Caixa (Box Aspect) no Matplotlib

Beginner

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

Introdução

Este laboratório irá guiá-lo através do processo de criação de diferentes gráficos usando o método set_box_aspect() em Matplotlib. Este método define a razão de aspecto entre a altura e a largura dos eixos em unidades físicas, independentemente dos limites dos dados. É útil para produzir gráficos quadrados, independentemente dos dados que contém, ou para ter um gráfico usual com as mesmas dimensões dos eixos ao lado de um gráfico de imagem com aspecto (de dados) fixo.

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

Eixos Quadrados, Independentes dos Dados

Produziremos eixos quadrados, independentemente dos limites dos dados.

import matplotlib.pyplot as plt
import numpy as np

fig1, ax = plt.subplots()

ax.set_xlim(300, 400)
ax.set_box_aspect(1)

plt.show()

Eixos Quadrados Compartilhados

Produziremos subplots compartilhados que são quadrados em tamanho.

fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)

ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])

ax.set_box_aspect(1)
ax2.set_box_aspect(1)

plt.show()

Eixos Gêmeos Quadrados

Produziremos eixos quadrados, com um eixo gêmeo (twin axes). O eixo gêmeo assume o aspecto da caixa (box aspect) do pai (parent).

fig3, ax = plt.subplots()

ax2 = ax.twinx()

ax.plot([0, 10])
ax2.plot([12, 10])

ax.set_box_aspect(1)

plt.show()

Gráfico Normal ao Lado de uma Imagem

Ao criar um gráfico de imagem com aspecto de dados fixo e o padrão adjustable="box" ao lado de um gráfico normal, os eixos teriam alturas desiguais. set_box_aspect() fornece uma solução fácil para isso, permitindo que os eixos do gráfico normal usem as dimensões das imagens como aspecto da caixa (box aspect). Este exemplo também mostra que o layout restrito (constrained layout) interage bem com um aspecto de caixa fixo.

fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")

np.random.seed(19680801)  ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)

ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])

plt.show()

Gráfico Conjunto/Marginal Quadrado

Pode ser desejável mostrar distribuições marginais ao lado de um gráfico de dados conjuntos. O seguinte cria um gráfico quadrado com o aspecto da caixa (box aspect) dos eixos marginais sendo igual às proporções de largura e altura do gridspec. Isso garante que todos os eixos se alinhem perfeitamente, independentemente do tamanho da figura.

fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
                         gridspec_kw=dict(height_ratios=[1, 3],
                                          width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)

np.random.seed(19680801)  ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")

plt.show()

Aspecto da Caixa (Box Aspect) para Muitos Subplots

É possível passar o aspecto da caixa (box aspect) para um Axes na inicialização. O seguinte cria uma grade de subplot 2 por 3 com todos os Axes quadrados.

fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
                         sharex=True, sharey=True, layout="constrained")

for i, ax in enumerate(axs.flat):
    ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()

Resumo

Este laboratório forneceu uma visão geral de como usar set_box_aspect() em Matplotlib para criar diferentes tipos de gráficos com uma razão de aspecto (aspect ratio) fixa entre a altura e a largura dos eixos.