Matplotlib: добавление осей с использованием тех же аргументов, что и предыдущие оси

Я хочу построить данные в двух разных подзаголовках. После построения графика я хочу вернуться к первому подзаговору и построить в нем дополнительный набор данных. Однако, когда я это делаю, я получаю это предупреждение:

MatplotlibDeprecationWarning: добавление осей с использованием тех же аргументов, что и предыдущие оси, в настоящее время повторно использует предыдущий экземпляр. В будущей версии всегда будет создан и возвращен новый экземпляр. Между тем это предупреждение может быть подавлено, а последующее поведение обеспечивается путем передачи уникального ярлыка каждому экземпляру осей.   warnings.warn(message, mplDeprecation, stacklevel = 1)

Я могу воспроизвести это с помощью простого фрагмента кода:

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)

Любые идеи о том, как избежать этого предупреждения? Я использую matplotlib 2.1.0. Похож на ту же проблему, что здесь

Ответ 1

Это хороший пример, который демонстрирует преимущества использования объектно-ориентированного API 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()

Примечание: более питонно, когда имена переменных начинаются со строчной буквы, например, data =... а не Data =... см. PEP8

Ответ 2

Использование plt.subplot(1,2,1) создает новую ось на текущем рисунке. Предупреждение об устаревании сообщает, что в будущей версии, когда вы его вызываете второй раз, он не будет захватывать ранее созданную ось, вместо этого она перезапишет ее.

Вы можете сохранить ссылку на первый экземпляр оси, присвоив ее переменной.

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)

Ответ 3

Обратите внимание, что в этом случае предупреждение является ложным срабатыванием. В идеале его не следует запускать в том случае, если вы используете plt.subplot(..) для повторной активации подплота, который был ранее создан.

Причиной plt.subplot этого предупреждения является то, что plt.subplot и fig.add_subplot() используют один и тот же путь кода внутри. Предупреждение предназначено для последнего, но не для первого.

Чтобы узнать больше об этом, см. Выпуски 12513. Короче говоря, люди работают над этим, но это не так просто, как изначально считалось, разделить две функции. На данный момент вы можете просто игнорировать предупреждение, если оно вызвано plt.subplot().

Ответ 4

Вы можете просто вызвать plt.clf() перед тем, как строить plt.clf(). Это очистит все существующие участки.

Ответ 5

У меня такая же проблема. Я имел обыкновение иметь следующий код, который поднял предупреждение:

(обратите внимание, что переменная Image - это просто мое изображение, сохраненное в виде массива)

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

и я решил это, изменив так:

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

Ответ 6

Для того, чтобы добавить что-то еще, кроме предыдущих ответов, особенно в отношении ответа @Tommaso Di Noto. В моем случае я должен был установить заголовок для графика, а не для оси, в любом случае, оба помогли мне, но, к вашему сведению, мне пришлось передать метку в add_subplot:

    fig = plt.figure()

    # Set Title
    plt.title('title')

    # Define the first axis
    ax1 = fig.add_subplot(111, label='title')

Если вам интересно, почему 111, это позиция в сетке, проверьте add_subplot: В Matplotlib, что означает аргумент в fig.add_subplot (111)?

Надеюсь, это помогло,

Ответ 7

Ошибка появляется, когда вы создаете один и тот же объект оси более одного раза. В вашем примере вы сначала создаете два объекта subplot (с помощью метода plt.subplot).

type(plt.subplot(2, 1, 2)) Out: matplotlib.axes._subplots.AxesSubplot

Python автоматически устанавливает последнюю созданную ось по умолчанию. Ось означает просто рамку для графика без данных. Вот почему вы можете выполнить plt.plot(data). Метод plot (data) печатает некоторые данные в вашем объекте оси. Когда вы затем попытаетесь напечатать новые данные на том же графике, вы не сможете просто использовать plt.subplot(2, 1, 2) снова, потому что python пытается создать новый объект оси по умолчанию. Итак, что вы должны сделать: назначить каждый субплот переменной.

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)

затем выберите свой "кадр", в который вы хотите напечатать данные:

ax1.plot(data)
ax2.plot(data+1)
ax1.plot(data+2)

Если вам интересно построить больше графиков (например, 5) на одной фигуре, просто сначала создайте фигуру. Ваши данные хранятся в DataFrame Pandas, и вы создаете для каждого столбца новый элемент оси в списке. Затем вы перебираете список и наносите на каждый элемент оси данные и выбираете атрибуты.

import pandas as pd 
import matplotlib.pyplot as plt 

#want to print all columns
data = pd.DataFrame('some Datalist')
plt.figure(1)
axis_list = []

#create all subplots in a list 
for i in range(data.shape[1]):
axis_list.append(plt.subplot(data.shape[1],1,i+1)

for i,ax in enumerate(axis_list):

    # add some options to each subplot  
    ax.grid(True)
    #print into subplots
    ax.plot(data.iloc[:,[i]])