Встроенный Matplotlib в Jupyter - как контролировать, когда сюжет показан? - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть функция, которая создает фигуру, и по какой-то причине она отображается в записной книжке Jupyter дважды, хотя я вообще не запускал show. Я передаю рис и топор как вывод этой функции и планирую показать это только позже.

Я запутался между plt, fig и ax функционерами и думаю, что ответ скрыт где-то там.

Вот анонимная версия моего кода:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline

def plot_curve(dummydata):
    # builds a chart

    fig,ax = plt.subplots(1) # get subplots
    fig.set_figheight(7)
    fig.set_figwidth(12) #set shape

    plt.plot(dummydata.x1, dummydata.y1,label = 'l1') #curve 1
    plt.plot(dummydata.x2, dummydata.y2,label = 'l2') #curve2

    plt.xlabel('xlabel') #labels
    plt.ylabel('xlabel')
    plt.yscale('linear') #scale and bounds
    plt.ylim(0,100)
    ymin,ymax= ax.get_ylim()
    ax.axhline(1, color='k', linestyle=':', label = 'lab1') #guideline - horizontal
    ax.axvline(2, color='r',linestyle='--', label = 'lab2') #guideline - vertical
    ax.axvline(3, color='g',linestyle='--', label = 'lab3') #guideline - vertical
    ax.arrow(1,2,3,0, head_width=0.1, head_length=0.01, fc='k', ec='k') # arrow
    rect = mpl.patches.Rectangle((1,2), 2,3, alpha = 0.1, facecolor='yellow',
             linewidth=0  , label= 'lab4') #yellow area patch
    ax.add_patch(rect)

    plt.legend()
    plt.title('title')
    return fig,ax

и затем вызовите его с помощью:

for i in range(3):
    dummydata = pd.DataFrame({
           'x1':np.arange(1+i,100,0.1), 
           'y1':np.arange(11+i,110,0.1),
           'x2':np.arange(1+i,100,0.1),
           'y2':np.arange(21+i,120,0.1)
             })

    fig,ax = plot_curve(dummydata) #get the chart

Что я должен изменить, чтобы не показывать фигура по умолчанию, а показывать ее только по моей команде? Спасибо

Ответы [ 2 ]

5 голосов
/ 03 мая 2020

Попробуйте отключить matplotlib , интерактивный режим , используя plt.ioff(). Если интерактивный режим отключен, графики будут отображаться только с явным plt.show().

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline

# Desactivate interactive mode
plt.ioff()

def plot_curve(dummydata):
    # the same code as before

Затем в другой ячейке

for i in range(3):
    dummydata = pd.DataFrame({
           'x1':np.arange(1+i,100,0.1), 
           'y1':np.arange(11+i,110,0.1),
           'x2':np.arange(1+i,100,0.1),
           'y2':np.arange(21+i,120,0.1)
             })

# I'am assuming this should not be in the for loop
# The plot will NOT be shown because we are not in interactive mode
fig, ax = plot_curve(dummydata) #get the chart

Графики пока не отображаются.

Теперь в другой ячейке

# Now ANY plot (figure) which was created and not shown yet will be finally shown
plt.show()

Сюжет наконец-то показан. Обратите внимание, что если вы создали несколько графиков, все они будут показаны сейчас.

2 голосов
/ 22 апреля 2020

Попробуйте:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib

При таком импорте вы не увидите фигуру после построения. Но вы можете увидеть цифру, написав fig в ячейку I Python:

dummydata = pd.DataFrame({
           'x1':np.arange(1,100,0.1), 
           'y1':np.arange(11,110,0.1),
           'x2':np.arange(1,100,0.1),
           'y2':np.arange(21,120,0.1)
             })
fig,ax = plot_curve(dummydata) #get the chart

fig # Will now plot the figure.

Это желаемый результат?

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