将全息图保存为 SVG

Ste*_* OB 5 holoviews

我想将 Holoviews 图保存为 SVG,但是我收到一条我不明白的错误消息:

    np.random.seed(9)
    data = np.random.rand(10, 2)
    points = hv.Points(data)
    labels = hv.Labels({('x', 'y'): data, 'text': [chr(65+i) for i in range(10)]}, ['x', 'y'], 'text')
    overlay = (points * labels).redim.range(x=(-0.2, 1.2), y=(-.2, 1.2))
    
    overlay.opts(
        opts.Labels(text_font_size='10pt', xoffset=0.08),
        opts.Points(color='black', size=5))
    
    hv.save(overlay, 'overlay.svg', fmt='svg')
Run Code Online (Sandbox Code Playgroud)
    ---------------------------------------------------------------------------
    Exception                                 Traceback (most recent call last)
    <ipython-input-29-b23ca97e9c01> in <module>
          9     opts.Points(color='black', size=5))
         10 
    ---> 11 hv.save(overlay, 'overlay.svg', fmt='svg')
    
    ~/miniconda3/envs/mybrew/lib/python3.7/site-packages/holoviews/util/__init__.py in save(obj, filename, fmt, backend, resources, toolbar, title, **kwargs)
        818             filename = '.'.join(formats[:-1])
        819     return renderer_obj.save(obj, filename, fmt=fmt, resources=resources,
    --> 820                              title=title)
        821 
        822 
    
    ~/miniconda3/envs/mybrew/lib/python3.7/site-packages/holoviews/plotting/renderer.py in save(self_or_cls, obj, basename, fmt, key, info, options, resources, title, **kwargs)
        592 
        593         with StoreOptions.options(obj, options, **kwargs):
    --> 594             plot, fmt = self_or_cls._validate(obj, fmt)
        595 
        596         if isinstance(plot, Viewable):
    
    ~/miniconda3/envs/mybrew/lib/python3.7/site-packages/holoviews/plotting/renderer.py in _validate(self, obj, fmt, **kwargs)
        302         if fmt not in all_formats:
        303             raise Exception("Format %r not supported by mode %r. Allowed formats: %r"
    --> 304                             % (fmt, self.mode, fig_formats + holomap_formats))
        305         self.last_plot = plot
        306         return plot, fmt
    
    Exception: Format 'svg' not supported by mode 'default'. Allowed formats: ['html', 'auto', 'png', 'widgets', 'scrubber', 'gif', 'auto', None]
Run Code Online (Sandbox Code Playgroud)

有人知道为什么会发生这种情况吗?根据文档:

http://holoviews.org/user_guide/Exporting_and_Archiving.html

应该可以导出到 SVG。

小智 5

使用默认'bokeh'后端时会出现此问题。我在这里找到了一个解决方案:

import holoviews as hv
from bokeh.io import export_svgs

def export_svg(obj, filename):
    plot_state = hv.renderer('bokeh').get_plot(obj).state
    plot_state.output_backend = 'svg'
    export_svgs(plot_state, filename=filename)

overlay = hv.Overlay(...)
export_svg(overlay, 'overlay.svg')
Run Code Online (Sandbox Code Playgroud)

但是,由于某种原因,点元素未使用此方法渲染。

另一种解决方案是切换到'matplotlib'后端(下面代码中的第一行),然后就hv.save(...)可以了。不幸的是,这两个后端并不与所有选项兼容。例如,在您的情况下,您必须更改text_font_sizefontsizesizetos并将值提高到 2 以进行相应的缩放:

hv.extension('matplotlib')

np.random.seed(9)
data = np.random.rand(10, 2)
points = hv.Points(data)
labels = hv.Labels({('x', 'y'): data, 'text': [chr(65+i) for i in range(10)]}, ['x', 'y'], 'text')
overlay = (points * labels).redim.range(x=(-0.2, 1.2), y=(-.2, 1.2))

overlay.opts(
    hv.opts.Labels(fontsize=10, xoffset=0.08),
    hv.opts.Points(color='black', s=25))

hv.save(overlay, 'overlay.svg', fmt='svg')
overlay
Run Code Online (Sandbox Code Playgroud)

如果 Holoviews 对样式选项有一个统一的 API,就像它对视觉元素所做的那样,那肯定会有所帮助。