Bokeh - save plot as svg (ValueError: OutputDocumentFor expects a sequence of Models)

Bokeh - save plot as svg (ValueError: OutputDocumentFor expects a sequence of Models)

我在 Bokeh 中绘制了一个图,但是当我尝试将其导出为 svg 文件时,出现以下错误:OutputDocumentFor 需要一系列模型。

我的代码是:

# plot 2D histogram

def plot_hist(ch1, ch2, ch1_name='G3BP1', ch2_name='Nucleocapsid'):
    '''Plot a 2D histogram from two channels'''
    # get histogram data
    df_hist = pd.DataFrame({ch1_name: ch1.ravel(), ch2_name: ch2.ravel()})
    df_hist = df_hist.groupby(df_hist.columns.tolist()).size().reset_index(name='count')
    df_hist['log count'] = np.log10(df_hist['count'])

    # make the plot
    return hv.VLine(10).opts(apply_ranges=True, line_width=2, color = 'black', line_dash = 'dashed') * hv.HLine(10).opts(apply_ranges=True, line_width=2, color = 'black', line_dash = 'dashed')*hv.Points(
        data=df_hist, kdims=['G3BP1', 'Nucleocapsid'], vdims=['log count'],
    ).opts(
        size=10,
        cmap='magma',
        color='log count',
        colorbar=True,
        colorbar_opts={"title": "log₁₀ count"},
        frame_height=500,
        frame_width=500,
        padding=0.05,
        xlabel='G3BP1',
        ylabel='Nucleocapsid',
        fontsize=15,        
    )

# make ROI mask
roi1_nt = (single_cell_roi_rCh[1] > 0) | (single_cell_roi_gCh[1] > 0)
roi1_nt = skimage.morphology.remove_small_objects(roi1_nt, min_size=3)



hv.renderer('bokeh').theme = 'caliber'

plot=plot_hist(im_r[roi1_nt], im_g[roi1_nt])

from bokeh.io import export_svgs
plot.output_backend = "svg"
export_svgs(plot, filename = "plot.svg")

最终是否有办法使用 Geotiff 将从此图中保存的 png 文件转换为 tiff 文件?

在此先感谢您的帮助。

看起来您正在使用 holoviews 在您的函数 plot_hist() 中创建图形。这不是散景 object.

请尝试调用 hv.render() 获取底层散景图。

下面的行应该创建一个 svg 文件。

import holoviews as hv
from bokeh.io import export_svgs

plot = plot_hist(im_r[roi1_nt], im_g[roi1_nt])
plot = hv.render(plot)
plot.output_backend = "svg"
export_svgs(plot, filename = "plot.svg")

编辑

正如@bigreddot 提到的,bokeh 也有一个 export_png() 工具。在这种情况下,代码应该如下所示。

import holoviews as hv
from bokeh.io import export_png

plot = plot_hist(im_r[roi1_nt], im_g[roi1_nt])
plot = hv.render(plot)
export_png(plot, filename = "plot.png")

如果您的目标是从“png”生成“tiff”文件,您可以按照此question on SO的解决方案。

from PIL import Image
img = Image.open('plot.png')
img.save('image.tiff')

如果 png 有一个 alpha 值,这可能会带来一些问题。在这种情况下,请检查此 关于在 Pillow 中打开 png。