#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'>
.
Вопросы:
- Почему ничего не отображается? Это потому, что в одной ячейке Jupyter можно «повторно использовать»
ax
, потому что она считывает все команды для построения графика, а затем отображает все сразу? Но не стоит пытаться «повторно использовать»ax
вне этой отдельной ячейки? - Почему тип
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')
Если вы найдете обоснование этого, пожалуйста, опубликуйте его, мне и, возможно, другим будет интересно.