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

Bokeh使用export_png导出Surface3d 3D曲面图生成空白图片如何解决

问题根因
  • 导出时机过早:export_png 默认仅等待Bokeh原生组件渲染完成就触发截图,你实现的Surface3d需要动态加载外部vis.js依赖、异步渲染3D曲面,导出动作发生时3D内容还未完成绘制,所以得到空白图片。
  • Chrome运行环境适配缺失:CentOS 7通常为无桌面的服务器环境,默认启动的Chrome缺少无头模式、沙箱关闭等必要参数,会导致页面渲染异常甚至启动失败。
  • 无自定义渲染等待逻辑:现有代码没有判断3D曲面是否完成渲染的逻辑,直接截图必然捕获不到未就绪的内容。
修复方案

你需要修改两处代码:writePlot导出函数、TypeScript实现部分(可选但更可靠)。

1. 修改导出函数适配环境+加等待逻辑

替换原有的writePlot函数如下:

from selenium.webdriver.chrome.options import Options
import time

def writePlot(plot, plotName, is_3d=False):
    """
    Write a plot to file.
    :param plot: the plot to write to file
    :param plotName: the filename of the plot
    :param is_3d: 是否为3D曲面图,是的话增加额外渲染等待时间
    """
    # 适配CentOS无桌面环境的Chrome启动参数
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # 无头模式,无GUI也能运行
    chrome_options.add_argument("--no-sandbox")  # 关闭沙箱,适配root用户运行场景
    chrome_options.add_argument("--disable-dev-shm-usage")  # 解决共享内存不足问题
    chrome_options.add_argument("--disable-gpu")  # 禁用GPU加速,避免服务器环境渲染异常

    driver = webdriver.Chrome(options=chrome_options)
    plotName = Path(plotName).with_suffix(".png")
    
    if is_3d:
        # 3D图增加额外等待,也可替换为显式等待3D canvas元素出现的逻辑,更精准
        export_png(plot, filename=plotName, webdriver=driver, timeout=10)  # 延长超时时间到10秒
        time.sleep(3)  # 额外等待3D渲染完成,可根据实际情况调整时长
    else:
        export_png(plot, filename=plotName, webdriver=driver)
    
    driver.quit()
    del driver

然后调用导出3D图的时候传入is_3d=True:

writePlot(surface, "test3d.png", is_3d=True)

2. (可选)优化TypeScript实现,确保资源预加载

如果你不想用固定时长等待,可以把vis.js的加载逻辑提前,避免动态加载的延迟,把TS代码里的initialize方法里的script加载逻辑替换为直接把vis.js的内容打包到实现里,或者在初始化的时候就标记资源加载状态,配合Selenium的显式等待判断渲染完成,可靠性更高。

验证步骤

修改后重新运行代码,即可正常导出3D曲面图。如果还是空白,可适当调长time.sleep的等待时长,或检查Chrome和chromedriver的版本是否匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:24:00