Bokeh 如何把图表导出为 PNG 或 SVG?Playwright 导出后端与透明背景配置
【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh
如果你已经用 Bokeh 画好了图表,想把它变成一张静态图片——放进文档、报告,或者拿去在 Illustrator 之类的编辑器里继续加工——需要用到 Bokeh 的导出功能:export_png、export_svg。导出过程会在内存中渲染布局并截取无头浏览器(headless browser)截图,因此额外依赖一个浏览器后端。Bokeh 默认使用 Playwright,并暂时保留已弃用的 Selenium 后端用于兼容。本文给出从安装依赖、选择后端,到导出 PNG/SVG 文件并配置透明背景的一条完整操作路径。
准备导出依赖:安装 Playwright 后端
导出功能需要一个无头浏览器。Playwright 是默认后端,安装分两步:先装 Bokeh 的可选 export 依赖(pyproject.toml 中exportextra 要求playwright >=1.49),再装 Chromium 的 headless shell:
pip install "bokeh[export]" playwright install --only-shell chromium也可以直接安装playwright包;Bokeh 只需要 Chromium 的 headless shell,不需要另外管理浏览器驱动二进制文件。
Selenium 后端自 4.0.0 起已弃用,将在未来的版本中移除,新代码请使用 Playwright。如果你确实要维护旧代码,文档给出的安装方式是conda install selenium geckodriver -c conda-forge(Firefox,且系统上需有版本兼容的 Firefox)或conda install selenium python-chromedriver-binary -c conda-forge(Chrome,且需保证chromedriver可执行文件在 PATH 中、版本与本机 Chrome/Chromium 匹配),也可以用pip安装selenium后自行下载 geckodriver 二进制。
三种方式指定导出后端
Bokeh 默认使用 Playwright。按优先级从高到低,有三种方式指定后端:
1. 直接传入浏览器实例(webdriver参数)。任何导出函数都接受webdriver关键字参数,可以传 SeleniumWebDriver或 PlaywrightBrowser/BrowserContext,后端按实例类型自动识别,并覆盖backend参数和全局设置。传 SeleniumWebDriver会发出弃用警告。
2. 每次调用时传backend参数:
from bokeh.io import export_png export_png(plot, filename="plot.png", backend="playwright")3. 全局设置。通过环境变量或settings修改,例如:
BOKEH_EXPORT_BACKEND=playwright python my_script.pyfrom bokeh.settings import settings settings.export_backend = "playwright"BOKEH_EXPORT_BACKEND的取值可以是auto、playwright或selenium。其中auto优先选 Playwright,Playwright 未安装时回落到弃用的 Selenium 后端;两个后端都不可用时,源码中的错误提示会告诉你如何安装(见 src/bokeh/io/export.py 中_resolve_backend的提示,以及 src/bokeh/settings.py 中export_backend的说明)。
导出 PNG
用法与save、show类似:
from bokeh.io import export_png export_png(plot, filename="plot.png")要点:
- 输出图片是 RGBA 格式的 PNG,尺寸与源布局一致,所以在画 figure 时建议直接给定
width、height,例如 export_to_png.py 中的figure(width=800, height=300, ...)。 - 响应式 sizing mode 可能生成尺寸和长宽比出乎意料的布局,为了结果稳定,文档建议使用默认的
fixedsizing mode。 filename不传时会从脚本名推导(如/foo/myplot.py生成/foo/myplot.png)。- 不想落盘、直接在代码中拿到图像对象时,用底层的
get_screenshot_as_png:
from bokeh.io.export import get_screenshot_as_png image = get_screenshot_as_png(obj, height=height, width=width, driver=webdriver)配置透明背景
要导出透明背景的 PNG,把Plot.background_fill_color和Plot.border_fill_color都设为None:
plot.background_fill_color = None plot.border_fill_color = None导出后用返回值验证:export_png会返回保存文件的绝对路径字符串,据此确认文件位置;如果布局渲染出的图像宽高为 0,函数会抛出ValueError: unable to save an empty image,此时应检查布局是否有有效的固定尺寸。
导出 SVG
SVG 导出会把 HTML5 Canvas 绘图输出替换为可在图像编辑软件中修改、或可转 PDF 的 SVG 元素。先启用 SVG 后端,两种方式任选其一:
# 方式一:创建时指定 plot = Plot(output_backend="svg") # 方式二:事后修改 plot.output_backend = "svg"注意 SVG 后端在渲染大量 glyph 或处理平移等大量用户交互时,性能不如默认 Canvas 后端——导出静态图没问题,别把交互式应用整体切到 SVG 后端。
然后按需求选择导出函数:
from bokeh.io import export_svg export_svg(plot, filename="plot.svg")export_svg:把一个 plot 或一组 plot 的布局保存为单个 SVG 文件;export_svgs:把布局中每个 SVG 后端的 plot 导出为各自独立的 SVG 文件:
from bokeh.io import export_svgs export_svgs(plot, filename="plot.svg")SVG 的透明背景配置与 PNG 完全相同:background_fill_color和border_fill_color设为None。export_svg返回保存的文件名列表,可据此核对生成的文件。
不写代码的替代路径(可选):
- 使用 SVG-Crowbar bookmarklet,会给页面上的每个 plot 添加下载为 SVG 的提示,Chrome 完全兼容,Firefox 大多数情况下可用;
- 使用工具栏里的
SaveTool,但注意导出文件在工具栏所在位置会留一块空白区域。
参考
- 导出功能完整文档:docs/bokeh/source/docs/user_guide/output/export.rst
- 可运行的 PNG 导出示例:examples/output/export/export_to_png.py
- 导出实现与后端解析逻辑:src/bokeh/io/export.py
export_backend设置(含BOKEH_EXPORT_BACKEND环境变量):src/bokeh/settings.py
限制小结:PNG 输出尺寸取决于布局本身,响应式 sizing mode 下尺寸可能不符合预期;SVG 后端牺牲交互性能换取可编辑的矢量输出;Selenium 后端已弃用,仅用于兼容旧环境。
【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考