首页 > 解决方案 > 在 jupyter 中使用 matplotlib 绘图:跨单元格分离代码的效果

问题描述

我正在学习 pandas 和 matplotlib,我看到了这种我无法理解的奇怪行为。

代码如下:

# plot the histograms for each feature
plt.figure(figsize=(15, 5))
for i, feature in enumerate(df.columns):
    plt.subplot(1, 4, i+1)
    df[feature].plot(kind='hist', title=feature)
    plt.xlabel(feature)

现在结果如下:

在此处输入图像描述

一切都好。

现在,如果我将代码分成两个单元格,结果会发生变化:

在此处输入图像描述

为什么结果不一样?

标签: pythonmatplotlibjupyter-notebook

解决方案


plt.figure()创建一个新Figure实例,plt.subplot将为当前图形添加一个子图 - 如果当前不存在,则创建一个实例。

在第一种情况下,plt.figure()创建一个Figure大小为的实例,(15,5)并且该实例现在是“当前图形”,直到它超出范围、关闭或实例化一个新Figure实例(或“当前图形”被其他一些方法)。plt.subplot然后将向该Figure实例添加一个子图 - 结果是一个(15,5)带有 4 个所需子图的大小图。

在第二种情况下,当调用plt.figure()在不同的单元格中时,它将不再是不同单元格中的“当前图形”。这是因为该图形在第一个单元格的执行结束时关闭- 这就是您看到<Figure size 1080x360 with 0 Axes>输出的原因。

解决这个问题的方法是存储返回的Figure实例plt.figure(),然后使用Figure.add_subplot而不是plt.subplot. 然后第一个单元格将是

fig = plt.figure(figsize=(15,5))

第二个是

for i, feature in enumerate(df.columns):
    fig.add_subplot(1, 4, i+1)
    df[feature].plot(kind='hist', title=feature)
    plt.xlabel(feature)

推荐阅读