Escalonamento automático #

Os limites em um eixo podem ser definidos manualmente (por exemplo ) ou o Matplotlib pode defini-los automaticamente com base nos dados já existentes nos eixos. Há várias opções para esse comportamento de escalonamento automático, discutidas abaixo.ax.set_xlim(xmin, xmax)

Começaremos com um gráfico de linha simples mostrando que o dimensionamento automático estende os limites do eixo 5% além dos limites de dados (-2π, 2π).

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

x = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y = np.sinc(x)

fig, ax = plt.subplots()
ax.plot(x, y)
escala automática
[<matplotlib.lines.Line2D object at 0x7f2cde5343a0>]

Margens #

A margem padrão em torno dos limites de dados é de 5%:

(0.05, 0.05)

As margens podem ser aumentadas usando margins:

fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(0.2, 0.2)
escala automática

Em geral, as margens podem estar no intervalo (-0,5, ∞), onde as margens negativas definem os limites dos eixos para um subintervalo do intervalo de dados, ou seja, cortam os dados. O uso de um único número para margens afeta ambos os eixos, uma única margem pode ser personalizada usando argumentos de palavra-chave xou y, mas a interface posicional e de palavra-chave não pode ser combinada.

escala automática

Bordas pegajosas #

Existem elementos de plotagem ( Artists) que geralmente são usados ​​sem margens. Por exemplo, imagens em cores falsas (por exemplo, criadas com Axes.imshow) não são consideradas no cálculo das margens.

xx, yy = np.meshgrid(x, x)
zz = np.sinc(np.sqrt((xx - 1)**2 + (yy - 1)**2))

fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].imshow(zz)
ax[0].set_title("default margins")
ax[1].imshow(zz)
ax[1].margins(0.2)
ax[1].set_title("margins(0.2)")
margens padrão, margens(0,2)
Text(0.5, 1.0, 'margins(0.2)')

Essa substituição de margens é determinada por "bordas fixas", uma propriedade de Artistclasse que pode suprimir a adição de margens aos limites do eixo. O efeito de arestas aderentes pode ser desabilitado em um eixo alterando use_sticky_edges. Os artistas têm uma propriedade Artist.sticky_edgese os valores das arestas adesivas podem ser alterados escrevendo em Artist.sticky_edges.xou Artist.sticky_edges.y.

O exemplo a seguir mostra como a substituição funciona e quando ela é necessária.

fig, ax = plt.subplots(ncols=3, figsize=(16, 10))
ax[0].imshow(zz)
ax[0].margins(0.2)
ax[0].set_title("default use_sticky_edges\nmargins(0.2)")
ax[1].imshow(zz)
ax[1].margins(0.2)
ax[1].use_sticky_edges = False
ax[1].set_title("use_sticky_edges=False\nmargins(0.2)")
ax[2].imshow(zz)
ax[2].margins(-0.2)
ax[2].set_title("default use_sticky_edges\nmargins(-0.2)")
padrão use_sticky_edges margins(0.2), use_sticky_edges=False margins(0.2), default use_sticky_edges margins(-0.2)
Text(0.5, 1.0, 'default use_sticky_edges\nmargins(-0.2)')

Podemos ver que definir use_sticky_edgescomo Falso renderiza a imagem com as margens solicitadas.

Embora as bordas fixas não aumentem os limites do eixo por meio de margens extras, as margens negativas ainda são levadas em consideração. Isso pode ser visto nos limites reduzidos da terceira imagem.

Controlando a escala automática #

Por padrão, os limites são recalculados toda vez que você adiciona uma nova curva ao gráfico:

fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].plot(x, y)
ax[0].set_title("Single curve")
ax[1].plot(x, y)
ax[1].plot(x * 2.0, y)
ax[1].set_title("Two curves")
Curva única, duas curvas
Text(0.5, 1.0, 'Two curves')

No entanto, há casos em que você não deseja ajustar automaticamente a viewport para novos dados.

Uma forma de desabilitar o dimensionamento automático é definir manualmente o limite do eixo. Digamos que queremos ver apenas uma parte dos dados com mais detalhes. A configuração xlimpersiste mesmo se adicionarmos mais curvas aos dados. Para recalcular os novos limites, a chamada Axes.autoscalealternará a funcionalidade manualmente.

fig, ax = plt.subplots(ncols=2, figsize=(12, 8))
ax[0].plot(x, y)
ax[0].set_xlim(left=-1, right=1)
ax[0].plot(x + np.pi * 0.5, y)
ax[0].set_title("set_xlim(left=-1, right=1)\n")
ax[1].plot(x, y)
ax[1].set_xlim(left=-1, right=1)
ax[1].plot(x + np.pi * 0.5, y)
ax[1].autoscale()
ax[1].set_title("set_xlim(left=-1, right=1)\nautoscale()")
set_xlim(esquerda=-1, direita=1) , set_xlim(esquerda=-1, direita=1) autoscale()
Text(0.5, 1.0, 'set_xlim(left=-1, right=1)\nautoscale()')

Podemos verificar se o primeiro gráfico está com a autoescala desativada e se o segundo gráfico está ativado novamente usando Axes.get_autoscale_on():

print(ax[0].get_autoscale_on())  # False means disabled
print(ax[1].get_autoscale_on())  # True means enabled -> recalculated
False
True

Os argumentos da função autoscale nos fornecem um controle preciso sobre o processo de dimensionamento automático. Uma combinação de argumentos enablee axisdefine o recurso de dimensionamento automático para o eixo selecionado (ou ambos). O argumento tight define a margem do eixo selecionado como zero. Para preservar as configurações de um enableou tightvocê pode definir o oposto como None , dessa forma ele não deve ser modificado. No entanto, definir enablecomo None e tight como True afeta ambos os eixos, independentemente do axisargumento.

fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(0.2, 0.2)
ax.autoscale(enable=None, axis="x", tight=True)

print(ax.margins())
escala automática
(0, 0)

Trabalhando com coleções #

A escala automática funciona imediatamente para todas as linhas, patches e imagens adicionadas aos eixos. Um dos artistas com os quais não funcionará é um arquivo Collection. Após adicionar uma coleção aos eixos, deve-se acionar manualmente o autoscale_view()para recalcular os limites dos eixos.

fig, ax = plt.subplots()
collection = mpl.collections.StarPolygonCollection(
    5, rotation=0, sizes=(250,),  # five point star, zero angle, size 250px
    offsets=np.column_stack([x, y]),  # Set the positions
    offset_transform=ax.transData,  # Propagate transformations of the Axes
)
ax.add_collection(collection)
ax.autoscale_view()
escala automática

Tempo total de execução do script: ( 0 minutos 6,508 segundos)

Galeria gerada por Sphinx-Gallery