Observação
Clique aqui para baixar o código de exemplo completo
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π).
[<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)
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 x
ou y
, mas a interface posicional e de palavra-chave não pode ser combinada.
fig, ax = plt.subplots()
ax.plot(x, y)
ax.margins(y=-0.2)
Bordas pegajosas #
Existem elementos de plotagem ( Artist
s) 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.
Text(0.5, 1.0, 'margins(0.2)')
Essa substituição de margens é determinada por "bordas fixas", uma propriedade de Artist
classe 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_edges
e os valores das arestas adesivas podem ser alterados escrevendo em Artist.sticky_edges.x
ou
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)")
Text(0.5, 1.0, 'default use_sticky_edges\nmargins(-0.2)')
Podemos ver que definir use_sticky_edges
como 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:
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 xlim
persiste mesmo se adicionarmos mais curvas aos dados. Para recalcular os novos limites, a chamada Axes.autoscale
alternará 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()")
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 enable
e axis
define 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
enable
ou tight
você pode definir o oposto como None , dessa forma ele não deve ser modificado. No entanto, definir enable
como None e tight como True afeta ambos os eixos, independentemente do axis
argumento.
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())
(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()
Tempo total de execução do script: ( 0 minutos 6,508 segundos)