【问题标题】:bokeh (python) export_svgs doesn't render image alpha散景(python)export_svgs 不渲染图像 alpha
【发布时间】:2018-11-16 10:52:34
【问题描述】:

我无法让bokeh.io.export_svgs() 正确输出带有 alpha 的图像。

玩具示例:

import numpy as np

import bokeh.plotting as bk_plt
import bokeh.io as bk_io

bk_plt.output_notebook()

N = 500
x = np.linspace(0, 10, N)
y = np.linspace(0, 10, N)
xx, yy = np.meshgrid(x, y)
d = np.sin(xx)*np.cos(yy)

p1 = bk_plt.figure(x_range=(0, 10), y_range=(0, 10))
p1.image(image=[d], x=0, y=0, dw=10, dh=10, palette="Spectral11", alpha = 0.5)
bk_plt.show(p1)


p2 = bk_plt.figure(x_range=(0, 10), y_range=(0, 10))
p2.image(image=[d], x=0, y=0, dw=10, dh=10, palette="Spectral11", alpha = 0.5)
p2.output_backend = 'svg'
bk_io.export_svgs(p2, filename = 'asdf.svg')
bk_plt.show(p2)

Bokeh 正确地将其输出到笔记本:

export_svgs() 错误地输出了这个:

有没有简单的方法来解决这个问题?

【问题讨论】:

  • Bokeh 依赖于第三方工具进行 SVG 导出,这可能是该工具中的错误,或者 Bokeh 使用它的方式中的错误。

标签: python image svg bokeh alpha


【解决方案1】:

找到一个可行的解决方案 - 创建一个 rgba 图像并改为绘制它:

import numpy as np

import bokeh.plotting as bk_plt
import bokeh.palettes as bk_pal
import bokeh.io as bk_io

bk_plt.output_notebook()

N = 500
x = np.linspace(0, 10, N)
y = np.linspace(0, 10, N)
xx, yy = np.meshgrid(x, y)
d = np.sin(xx)*np.cos(yy)


def Make_RGBA(Val, Palette, alpha):
    X, Y = Val.shape

    Pal = [tuple(int(P[i:i+2], 16) for i in (1, 3 ,5)) for P in Palette]
    a = (len(Pal)) / (Val.max() - Val.min()) 
    b = Val.min()
    Temp_Val = (a * (Val - b)).astype(int)
    Temp_Val = np.minimum(Temp_Val, len(Pal) - 1)

    img = np.empty((X, Y), dtype=np.uint32)
    view = img.view(dtype=np.uint8).reshape((X, Y, 4))
    for i in range(X):
        for j in range(Y):
            view[i, j, 0] = Pal[Temp_Val[i][j]][0]
            view[i, j, 1] = Pal[Temp_Val[i][j]][1]
            view[i, j, 2] = Pal[Temp_Val[i][j]][2]
            view[i, j, 3] = 255 * alpha

    return img

img = Make_RGBA(d, bk_pal.Spectral11, 0.5)

p1 = bk_plt.figure(x_range=(0, 10), y_range=(0, 10))
p1.image(image=[d], x=0, y=0, dw=10, dh=10, palette="Spectral11", alpha = 0.5)
bk_plt.show(p1)

p2 = bk_plt.figure(x_range=(0, 10), y_range=(0, 10))
p2.image_rgba(image=[img], x=[0], y=[0], dw=[10], dh=[10])
p2.output_backend = 'svg'
bk_io.export_svgs(p2, filename = 'asdf.svg')
bk_plt.show(p2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多