Como digo ao Matplotlib para criar um segundo (novo) enredo e depois mais tarde no antigo?

147

Eu quero plotar dados, criar uma nova figura e plotar dados2 e, finalmente, voltar ao plot e plotar dados3 originais, mais ou menos assim:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

Para sua informação, como posso dizer ao matplotlib que terminei com uma trama? faz algo semelhante, mas não exatamente! Não me permite ter acesso a esse enredo original.

Peter D
fonte

Respostas:

152

Se você se encontra fazendo coisas assim regularmente, pode valer a pena investigar a interface orientada a objetos para o matplotlib. No seu caso:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

É um pouco mais detalhado, mas é muito mais claro e fácil de acompanhar, especialmente com várias figuras, cada uma com várias subparcelas.

simonb
fonte
2
Prefiro a abordagem orientada a objetos, pois quando previ ter muitas figuras, será mais fácil acompanhá-las usando nomes em vez de números. Obrigado!
Peter D
1
Mas como se pode alterar os limites de rótulo e eixo com essa abordagem. Se eu usá- ax1.ylabello, diz que não foi encontrado. Mesmo com fig1.ylabel...
George Datseris
3
@GeorgeDatseris A sintaxe é um pouco diferente. É ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")e ax1.set_title("your title").
simonb 12/09/16
1
por que você usou 111?
Yash Sodha
2
@yashSodha - é uma especificação no estilo matlab do número de subtramas (linhas, col, índice). Mas agora é muito mais fácil de usar plt.subplots(nrows, ncols). Atualizou o exemplo.
SimonB
120

Quando você ligar figure, basta numerar o gráfico.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Editar: observe que você pode numerar as plotagens da maneira que desejar (aqui, a partir de 0), mas se você não fornecer um número para a figura quando criar uma nova, a numeração automática começará em 1("Estilo Matlab" de acordo com para os documentos).

agf
fonte
3
Isso parece funcionar no modo interativo do matplotlib, enquanto o método figure () ... add_subplot () não. Obrigado!
chbrown
@SebMa Por favor, não altere o código sem entendê-lo. Esta resposta foi especificamente sobre passar um número para o figurequal você removeu. As outras coisas que você alterou foram copiadas da postagem original e não erros na minha resposta.
precisa
@ AGF Oi, eu removi o 1interior, plt.figure(1)porque eu pensei que o número foi incrementado automaticamente e, portanto, não é necessário. Desculpe.
SebMa
18

No entanto, a numeração começa em 1, portanto:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Além disso, se você tiver vários eixos em uma figura, como subtramas, use o axes(h)comando onde hestá a alça do objeto de eixos desejado para focar nesses eixos.

(ainda não tem privilégios para comentários, desculpe-me pela nova resposta!)

Ross B.
fonte
10
0funciona, a numeração automática apenas começa em 1, se você não der um número para ele.
agf
0

Uma maneira que encontrei após algumas dificuldades é criar uma função que obtém a matriz data_plot, o nome do arquivo e a ordem como parâmetro para criar gráficos de caixas a partir dos dados fornecidos na figura ordenada (ordens diferentes = figuras diferentes) e salvá-la no nome do arquivo.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
emir
fonte