如何让Jupyter中%matplotlib widget绘图支持下载SVG等矢量格式?
解决方案
%matplotlib widget 使用的是 ipympl 后端,默认仅提供PNG格式一键导出,没有桌面端的格式选择弹窗,可通过以下方法实现SVG等矢量格式导出:
方法1:单图指定导出格式
适合仅需要修改当前图像导出格式的场景,要求 ipympl 版本≥0.7,仅需在显示画布前新增一行配置即可。
修改后的完整代码如下:
import IPython.display from IPython.display import display from ipywidgets import widgets, Layout %matplotlib widget import matplotlib as mpl import matplotlib.pyplot as plt widget_out = widgets.Output(layout=Layout(width='100%')) with widget_out: widget_out.clear_output(wait=True) plt.ioff() fig = plt.figure(figsize=(10,1), dpi=90) ax = fig.add_subplot(111) ax.plot([0,1,2], [0,1,2]) plt.ion() # 新增该行修改下载格式为svg,可替换为pdf、eps等matplotlib支持的格式 fig.canvas.toolbar.download_format = 'svg' display(fig.canvas) myvbox = widgets.VBox([ widget_out, ],) display(myvbox)
修改完成后点击原有「Download plot」按钮,即可直接下载SVG格式的矢量图。
如果运行报错说明ipympl版本过低,可先执行命令升级:pip install --upgrade ipympl
方法2:全局设置默认导出格式
如果希望所有%matplotlib widget生成的图像默认都导出SVG格式,可在代码开头导入matplotlib后添加全局配置:
plt.rcParams['savefig.format'] = 'svg'
方法3:自定义多格式导出组件
如果需要灵活切换导出格式,可额外添加ipywidgets组件实现格式选择后导出,示例代码如下:
# 格式选择下拉框 format_selector = widgets.Dropdown( options=['png', 'svg', 'pdf', 'eps'], value='svg', description='导出格式:', ) # 导出按钮 export_btn = widgets.Button(description='导出图像', button_style='success') def on_export_click(b): import io buf = io.BytesIO() fig.savefig(buf, format=format_selector.value, bbox_inches='tight') buf.seek(0) # 生成下载组件 download = widgets.Download( data=buf.getvalue(), filename=f'plot.{format_selector.value}' ) download.click() export_btn.on_click(on_export_click) # 将自定义组件加入布局 myvbox = widgets.VBox([widgets.HBox([format_selector, export_btn]), widget_out]) display(myvbox)
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

