在 Jupyter 中内联 Matplotlib - 如何在显示绘图时控制?

Dim*_*old 3 python matplotlib jupyter-notebook

我有一个创建图形的函数,由于某种原因,它在 Jupyter notebook 中显示了两次,即使我根本没有运行show。我将 fig 和 ax 作为此函数的输出传递,并计划稍后显示它。

我在plt,figax工作人员之间感到困惑,并猜测答案隐藏在那里。

这是我的代码的匿名版本:

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
Run Code Online (Sandbox Code Playgroud)

然后调用它:

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
Run Code Online (Sandbox Code Playgroud)

我应该更改为默认情况下不显示图形,而仅通过我的命令显示它?谢谢

dar*_*amo 6

尝试禁用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
Run Code Online (Sandbox Code Playgroud)

然后在另一个单元格中

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
Run Code Online (Sandbox Code Playgroud)

尚未显示任何情节。

现在在另一个单元格中

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

剧情终于显示出来了。请注意,如果您创建了多个图,现在将显示所有图。