AxesSubplot не отображается после plot() в другой ячейке

#python #pandas #dataframe #matplotlib #plot

#python #панды #фрейм данных #matplotlib #график

Вопрос:

Я отображаю некоторые данные из pandas DataFrame такой Jupyter notebook ячейки:

     ax = data.plot('Weight', 'Height', kind='scatter', backend='matplotlib')
    print(type(ax))
    ax.plot(xs, line1, color='red')
    print(type(ax))
    ax.plot(xs, line2, color='yellow')
    print(type(ax))
  

Я вижу, что ax это относится к типу <class 'matplotlib.axes._subplots.AxesSubplot'> . Все хорошо.

Затем в следующей ячейке я пытаюсь построить другую строку, повторно ax используя, как я делал с ax.plot(xs, line2, color='yellow') :

 ax.plot(w1_arr, errors, color='red')
print(type(ax)) 
  

Однако ничего не отображается, кроме типа ax , он тот же <class 'matplotlib.axes._subplots.AxesSubplot'> .

Вопросы:

  1. Почему ничего не отображается? Это потому, что в одной ячейке Jupyter можно «повторно использовать» ax , потому что она считывает все команды для построения графика, а затем отображает все сразу? Но не стоит пытаться «повторно использовать» ax вне этой отдельной ячейки?
  2. Почему тип ax AxesSubplot , а не просто Axes ? Согласно DataFrame.plot(), он должен возвращать оси, я явно установил backend=’matplotlib’ .

Ответ №1:

Повозившись, я нашел способ заставить его работать, но я также изучаю его, это интересное поведение, и я также не до конца понимаю его atm.

Мне кажется, что это связано с тем, как художник и средство визуализации сохраняются и сохраняются в Figure Axes классах or и в ячейках jupyter.

Следующий фрагмент будет работать:

 ############################ CELL 1 ################################
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'a': np.random.randint(0,30,10), 'b': np.random.randint(0,30,10)})

fig, ax = plt.subplots()
df.plot('a', 'b', kind='scatter', backend='matplotlib', ax=ax)
ax.plot(np.arange(0,30,10), np.arange(0,30,10), color='red')
ax.plot(np.arange(0,30,10), np.arange(0,30,10) 5, color='yellow')

############################ CELL 2 ################################
ax.plot(np.arange(0,30,10), np.arange(0,30,10) 15, color='blue')
fig
  

Кроме того, поведение, которое вы наблюдали, также должно быть связано с встроенным отображением jupyter. Если вы используете qt вместо этого by %matplotlib qt , который создаст внешнюю фигуру, опубликованный вами код будет работать нормально, например:

 ############################ CELL 1 ################################
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib qt

df = pd.DataFrame({'a': np.random.randint(0,30,10), 'b': np.random.randint(0,30,10)})

ax = df.plot('a', 'b', kind='scatter', backend='matplotlib')
ax.plot(np.arange(0,30,10), np.arange(0,30,10), color='red')
ax.plot(np.arange(0,30,10), np.arange(0,30,10) 5, color='yellow')

############################ CELL 2 ################################
# minimize the figure that popped up and run the second cell
ax.plot(np.arange(0,30,10), np.arange(0,30,10) 15, color='blue')
  

Если вы найдете обоснование этого, пожалуйста, опубликуйте его, мне и, возможно, другим будет интересно.