python - plotar - Matplotlib: Adicionando um eixo usando os mesmos argumentos de um eixo anterior



python pip matplotlib windows (4)

Este é um bom exemplo que mostra o benefício de usar a API orientada a objetos do matplotlib .

import numpy as np
import matplotlib.pyplot as plt

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(data)

ax2.plot(data)

ax1.plot(data+1)

plt.show()

Nota: é mais pythonic ter nomes de variáveis ​​começando com uma letra minúscula, por exemplo, data = ... vez de Data = ... veja PEP8

https://src-bin.com

Quero traçar dados em duas subtramas diferentes. Após a plotagem, quero voltar para a primeira subtrama e plotar um conjunto de dados adicional nela. No entanto, quando faço isso, recebo este aviso:

MatplotlibDeprecationWarning: Adicionar um eixo usando os mesmos argumentos que os eixos anteriores reutilizam atualmente a instância anterior. Em uma versão futura, uma nova instância sempre será criada e retornada. Enquanto isso, esse aviso pode ser suprimido e o comportamento futuro garantido, passando um rótulo exclusivo para cada ocorrência de eixos. warnings.warn (message, mplDeprecation, stacklevel = 1)

Eu posso reproduzir isso com um simples pedaço de código:

import matplotlib.pyplot as plt
import numpy as np

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
plt.figure()
plt.subplot(1, 2, 1)
plt.plot(data)

plt.subplot(1, 2, 2)
plt.plot(data)

plt.subplot(1, 2, 1) # Warning occurs here
plt.plot(data + 1)

Alguma idéia de como evitar esse aviso? Eu uso o matplotlib 2.1.0. Parece que o mesmo problema here


Answer #1

Eu tive o mesmo problema. Eu costumava ter o seguinte código que levantou o aviso:

(note que a variável Image é simplesmente minha imagem salva como array numpy)

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)  # create new image
plt.title("My image")  # set title
# initialize empty subplot
AX = plt.subplot()  # THIS LINE RAISED THE WARNING
plt.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations

e resolvi isso, modificando assim:

import numpy as np
import matplotlib.pyplot as plt

fig_1 = plt.figure(1)  # create new image and assign the variable "fig_1" to it
AX = fig_1.add_subplot(111)  # add subplot to "fig_1" and assign another name to it
AX.set_title("My image")  # set title
AX.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations

Answer #2

Observe que, nesse caso, o aviso é um falso positivo. Idealmente, não deve ser acionado no caso de você usar plt.subplot(..) para reativar uma subtrama que tenha sido criada anteriormente.

A razão pela qual esse aviso ocorre é que plt.subplot e fig.add_subplot() assumem o mesmo caminho de código internamente. O aviso é destinado a este último, mas não ao primeiro.

Para ler mais sobre isso, consulte os números 12513 . Para encurtar a história, as pessoas estão trabalhando nisso, mas não é tão fácil quanto se pensava inicialmente em dissociar as duas funções. No momento, você pode simplesmente ignorar o aviso se ele for acionado por plt.subplot() .


Answer #3

Usando plt.subplot(1,2,1) cria um novo eixo na figura atual. O aviso de descontinuação está dizendo que, em uma versão futura, quando você o chamar pela segunda vez, ele não irá capturar o eixo criado anteriormente, em vez disso, ele irá sobrescrevê-lo.

Você pode salvar uma referência à primeira instância do eixo, atribuindo-a a uma variável.

plt.figure()
# keep a reference to the first axis
ax1 = plt.subplot(1,2,1)
ax1.plot(Data)

# and a reference to the second axis
ax2 = plt.subplot(1,2,2)
ax2.plot(Data)

# reuse the first axis
ax1.plot(Data+1)




matplotlib