Como fazer #

Por que tenho tantos ticks e/ou por que eles estão fora de ordem? #

Uma causa comum para o comportamento inesperado do tick é passar uma lista de strings em vez de números ou objetos de data e hora . Isso pode acontecer facilmente sem aviso prévio ao ler um arquivo de texto delimitado por vírgulas. Matplotlib trata listas de strings como variáveis ​​categóricas ( Plotando variáveis ​​categóricas ) e, por padrão, coloca um tick por categoria e as plota na ordem em que são fornecidas.

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))

ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9']  # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)

ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)]  # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)

( Código fonte , png )

../../_images/howto_faq-1.png

A solução é converter a lista de strings em números ou objetos datetime (geralmente ou ).np.asarray(numeric_strings, dtype='float')np.asarray(datetime_strings, dtype='datetime64[s]')

Para obter mais informações, consulte Corrigindo muitos tiques .

Determine a extensão dos Artistas na Figura #

Às vezes queremos saber a extensão de um Artista. Os objetos Matplotlib Artistpossuem um método Artist.get_window_extentque geralmente retorna a extensão do artista em pixels. No entanto, alguns artistas, em particular o texto, devem ser renderizados pelo menos uma vez antes que sua extensão seja conhecida. Matplotlib fornece Figure.draw_without_rendering, que deve ser chamado antes de chamar get_window_extent.

Verifique se uma figura está vazia #

Vazio pode realmente significar coisas diferentes. A figura contém algum artista? Uma figura com um vazio Axesainda conta como vazia? A figura está vazia se foi renderizada em branco puro (pode haver artistas presentes, mas eles podem estar fora da área de desenho ou transparentes)?

Para o propósito aqui, definimos vazio como: "A figura não contém nenhum artista, exceto o patch de fundo." A exceção para o fundo é necessária, porque por padrão toda figura contém um Rectanglepatch de fundo. Esta definição pode ser verificada via:

def is_empty(figure):
    """
    Return whether the figure contains no Artists (other than the default
    background patch).
    """
    contained_artists = figure.get_children()
    return len(contained_artists) <= 1

Decidimos não incluir isso como um método de figura porque essa é apenas uma maneira de definir vazio, e verificar o que foi dito acima raramente é necessário. Normalmente, o usuário ou programa que manipula a figura sabe se adicionou algo à figura.

Verificar se uma figura seria renderizada vazia não pode ser verificado de forma confiável, exceto renderizando a figura e investigando o resultado renderizado.

Encontre todos os objetos em uma figura de um certo tipo #

Cada artista do Matplotlib (consulte o tutorial Artist ) tem um método chamado findobj()que pode ser usado para pesquisar recursivamente o artista por quaisquer artistas que ele possa conter que atendam a alguns critérios (por exemplo, corresponder a todas as Line2D instâncias ou corresponder a alguma função de filtro arbitrária). Por exemplo, o trecho a seguir localiza cada objeto na figura que possui uma set_colorpropriedade e torna o objeto azul:

def myfunc(x):
    return hasattr(x, 'set_color')

for o in fig.findobj(myfunc):
    o.set_color('blue')

Você também pode filtrar por instâncias de classe:

import matplotlib.text as text
for o in fig.findobj(text.Text):
    o.set_fontstyle('italic')

Impedir que os rótulos tenham um deslocamento #

O formatador padrão usará um deslocamento para reduzir o comprimento dos rótulos. Para desativar esse recurso por eixo:

ax.get_xaxis().get_major_formatter().set_useOffset(False)

set rcParams["axes.formatter.useoffset"](padrão: True) ou use um formatador diferente. Consulte tickerpara obter detalhes.

Salvar figuras transparentes #

O savefig()comando possui um argumento de palavra-chave transparent que, se 'True', tornará o fundo da figura e dos eixos transparente ao salvar, mas não afetará a imagem exibida na tela.

Se você precisar de um controle mais refinado, por exemplo, você não deseja transparência total ou deseja afetar a versão exibida na tela também, pode definir as propriedades alfa diretamente. A figura tem uma Rectangleinstância chamada patch e os eixos tem uma instância Rectangle chamada patch . Você pode definir qualquer propriedade diretamente neles ( facecolor , edgecolor , linewidth , linestyle , alpha ). por exemplo:

fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)

Se você precisar que todos os elementos da figura sejam transparentes, atualmente não há configuração alfa global, mas você pode definir o canal alfa em elementos individuais, por exemplo:

ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)

Salve vários gráficos em um arquivo pdf #

Muitos formatos de arquivo de imagem podem ter apenas uma imagem por arquivo, mas alguns formatos suportam arquivos de várias páginas. Atualmente, o Matplotlib fornece apenas saída de várias páginas para arquivos pdf, usando os back-ends pdf ou pgf, por meio das classes backend_pdf.PdfPagese .backend_pgf.PdfPages

Abra espaço para rótulos de escala #

Por padrão, Matplotlib usa margens percentuais fixas em torno de subtramas. Isso pode fazer com que os rótulos se sobreponham ou sejam cortados no limite da figura. Existem várias maneiras de corrigir isso:

Alinhar meus ylabels em vários subplots #

Se você tiver vários subplots um sobre o outro e os dados y tiverem escalas diferentes, muitas vezes você pode obter ylabels que não se alinham verticalmente nos vários subplots, o que pode ser pouco atraente. Por padrão, o Matplotlib posiciona a localização x do ylabel para que não se sobreponha a nenhum dos y ticks. Você pode substituir esse comportamento padrão especificando as coordenadas do rótulo. O exemplo abaixo mostra o comportamento padrão nas subtramas à esquerda e a configuração manual nas subtramas à direita.

../../_images/sphx_glr_align_ylabels_001.png

Controle a ordem de desenho dos elementos do gráfico #

A ordem de desenho dos elementos do gráfico e, portanto, quais elementos estarão no topo, é determinada pela set_zorderpropriedade. Veja Zorder Demo para uma descrição detalhada.

Faça com que a proporção dos gráficos seja igual a #

A propriedade Axes set_aspect()controla a proporção dos eixos. Você pode configurá-lo como 'automático', 'igual' ou alguma proporção que controle a proporção:

ax = fig.add_subplot(111, aspect='equal')

Consulte Proporção de eixo igual para obter um exemplo completo.

Desenhe várias escalas do eixo y #

Uma solicitação frequente é ter duas escalas para o eixo y esquerdo e direito, o que é possível usando twinx()(mais de duas escalas não são suportadas atualmente, embora esteja na lista de desejos). Isso funciona muito bem, embora haja algumas peculiaridades quando você está tentando panorâmica e zoom interativamente, porque ambas as escalas não recebem os sinais.

A abordagem usa twinx()(e sua irmã twiny()) para usar 2 eixos diferentes , desativando o quadro retangular dos eixos no 2º eixo para evitar que ele obscureça o primeiro e definindo manualmente os locais e rótulos de marcação conforme desejado. Você pode usar matplotlib.tickerformatadores e localizadores separados conforme desejado porque os dois eixos são independentes.

( Código fonte , png )

../../_images/howto_faq-2.png

Veja Gráficos com escalas diferentes para um exemplo completo.

Gere imagens sem que uma janela apareça #

Simplesmente não ligue showe salve diretamente a figura no formato desejado:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')

Veja também

Incorporação em um servidor de aplicativos da web (Flask) para obter informações sobre a execução de matplotlib dentro de um aplicativo da web.

Trabalhar com tópicos #

Matplotlib não é thread-safe: na verdade, existem condições de corrida conhecidas que afetam certos artistas. Portanto, se você trabalha com threads, é sua responsabilidade configurar os bloqueios adequados para serializar o acesso aos artistas do Matplotlib.

Você pode trabalhar em figuras separadas de tópicos separados. No entanto, você deve, nesse caso, usar um back-end não interativo (normalmente Agg), porque a maioria dos back-ends da GUI também exige que sejam executados a partir do thread principal.