You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Apache Zeppelin中使用matplotlib报错,同代码在PyCharm可正常运行

解决Apache Zeppelin中Matplotlib 3D绘图报错的问题

嗨,我之前也踩过Zeppelin里用Matplotlib画3D图的坑,结合你的代码来看,大概率是Zeppelin的Matplotlib渲染配置、Spark DataFrame处理逻辑或者3D轴初始化方式的问题,下面给你几个亲测有效的解决方案:

常见问题与修复方案

1. Zeppelin的Matplotlib后端不兼容3D渲染

Zeppelin默认的Matplotlib后端可能不支持3D图形渲染,需要手动指定合适的后端,或者启用inline渲染模式:

  • 在代码块最开头添加Zeppelin魔法命令启用inline显示:
    %matplotlib inline
    
  • 同时在导入Matplotlib前指定兼容的后端:
    import matplotlib
    matplotlib.use('Agg')  # 非交互式环境下最稳定的后端,支持3D渲染
    

2. 3D轴初始化方式冲突

Zeppelin自动处理图表时,直接用fig.add_subplot(111, projection='3d')可能会出现渲染异常,建议手动初始化3D轴:

# 替换原来的ax初始化代码
fig = plt.figure(figsize=(10,8))
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

3. Spark DataFrame转Pandas的潜在问题

Zeppelin中如果Spark作业未完全执行就转Pandas,会导致数据缺失或报错,建议先触发Spark作业执行:

# 先缓存并触发action,确保数据加载完成
predict_df = predict_df.limit(100).cache()
predict_df.count()  # 强制Spark执行计算
df = predict_df.toPandas()

4. 绘图后的显示逻辑

PyCharm会自动弹出绘图窗口,但Zeppelin需要手动触发显示,推荐两种方式:

# 方式1:用Matplotlib原生显示
plt.show()

# 方式2:用Zeppelin自带的display函数(更稳定)
import zeppelin
zeppelin.display(plt)

完整可运行示例代码

%matplotlib inline
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.patches as mpatches

# 处理Spark DataFrame,确保数据加载完成
predict_df = predict_df.limit(100).cache()
predict_df.count()
df = predict_df.toPandas()

# 准备图例元素
c1 = mpatches.Patch(color="green", label="No Traffic")
c2 = mpatches.Patch(color="red", label="Traffic")
colors = {0:"red", 1:"green"}

# 初始化3D绘图对象
fig = plt.figure(figsize=(10,8))
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

# 绘制3D散点图(替换your_label_column为你的实际标签列名)
ax.scatter(df["avgSpeed"], df["vehicleCount"], df["avgMeasuredTime"],
           c=df["your_label_column"].map(colors), s=50, alpha=0.7)

# 设置图表标签与图例
ax.set_xlabel('Average Speed')
ax.set_ylabel('Vehicle Count')
ax.set_zlabel('Average Measured Time')
ax.legend(handles=[c1, c2])

# 显示图表
plt.show()

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

火山引擎 最新活动