You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook中plt.show()显示空图形<Figure...>问题求助

问题:Jupyter Notebook中3D交互图形无法显示,仅输出<Figure size 800x800 with 0 Axes>

我正在学习CISCO IoT Big Data课程,需在Python内核的Jupyter Notebook中完成实验。严格按照实验步骤操作后仍无法显示图形,仅输出:

return (<Figure size 800x800 with 0 Axes>
)

代码如下:

%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from ipywidgets import interact

def scatter_view(x, y, z, azim, elev):
    # Init figure and axes
    fig = plt.figure(figsize=(8, 8))
    ax = Axes3D(fig)
    
    # Compute scatter plot
    ax.scatter(x, y, z)
    ax.set_xlabel('D rate (Mbit/s)', fontsize=16)
    ax.set_ylabel('U rate (Mbit/s)', fontsize=16)
    ax.set_zlabel('P rate (1/s)', fontsize=16)
    ax.azim = azim
    ax.elev = elev

xi = df_rates['download_rate']
yi = df_rates['upload_rate']
zi = df_rates['ping_rate']
interact(lambda azim, elev: scatter_view(xi, yi, zi, azim, elev),
         azim=(0, 90), elev=(0, 90))
plt.show()

尝试过修改图形尺寸、调整%matplotlib inline的位置,未找到解决办法,恳请告知问题原因。


问题原因及解决方法

核心问题

  • 每次调用scatter_view都会创建新的figure,但interact结合%matplotlib inline时,新创建的图形没有被正确返回和渲染,反而最后plt.show()只显示了初始空的figure(因为interact回调里的fig未关联到当前显示流)。
  • 旧版Axes3D(fig)的初始化方式在新版matplotlib中已不推荐,容易导致画布关联异常。

修改后的代码

%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from ipywidgets import interact

def scatter_view(x, y, z, azim, elev):
    # 清除当前画布内容,避免重复叠加
    plt.clf()
    # 获取当前画布并添加3D子图
    ax = plt.gcf().add_subplot(projection='3d')
    
    # 绘制散点图
    ax.scatter(x, y, z)
    ax.set_xlabel('D rate (Mbit/s)', fontsize=16)
    ax.set_ylabel('U rate (Mbit/s)', fontsize=16)
    ax.set_zlabel('P rate (1/s)', fontsize=16)
    ax.azim = azim
    ax.elev = elev

xi = df_rates['download_rate']
yi = df_rates['upload_rate']
zi = df_rates['ping_rate']
# 直接绑定函数,无需匿名lambda
interact(scatter_view, x=xi, y=yi, z=zi, azim=(0, 90), elev=(0, 90))

关键修改说明

  1. 移除plt.show():interact会自动处理交互过程中的图形更新,手动调用反而会显示空画布;
  2. 复用当前画布:用plt.clf()清除内容,plt.gcf()获取当前画布,避免每次创建新fig导致渲染丢失;
  3. 替换轴初始化方式:用add_subplot(projection='3d')替代Axes3D(fig),符合matplotlib新版规范;
  4. 简化interact绑定:直接传递scatter_view函数,避免匿名lambda无法返回图形对象的问题。

内容的提问来源于stack exchange,提问作者Bajan Madalin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:03:35