首页 > 解决方案 > 从 bokeh==2.1.1 升级到 bokeh==2.2.0 会破坏 figure.image_rgba()

问题描述

这段代码在使用时呈现图像(尽管是颠倒的)bokeh==2.1.1

from PIL import Image
import numpy as np
import requests

from bokeh.plotting import figure
from bokeh.io import output_notebook
from bokeh.plotting import show
output_notebook()

response = requests.get('https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg', stream=True)
rgba_img = Image.open(response.raw).convert("RGBA")
numpy_img = np.array(rgba_img)

fig = figure()
plotted_image = fig.image_rgba(image=[np_img], x=50, y=50, dw=50, dh=50)
show(fig)

bokeh==2.2.0在(以及更高版本)中运行完全相同的代码不会输出任何内容,也不会引发任何错误。

bokeh 的发行说明没有提到对image_rgba()

标签: pythonpython-3.xbokeh

解决方案


错误在浏览器的JS控制台中(因为错误实际上发生在浏览器中,而不是在“python端”):

未处理的承诺拒绝:错误:预期为 2D 数组

如果您查看np_img,您会发现它不是二维数组:

In [3]: np_img.shape
Out[3]: (297, 275, 4)

In [4]: np_img.dtype
Out[4]: dtype('uint8')

Bokeh 需要 uint32 的 2D 数组,而不是 uint8 的 3D 数组,这一直是这种情况,并且在文档中已经演示过。过去可能会意外或无意地接受 3D 数组(这就是为什么在发行说明中不会注意到任何更改),或者 NumPy 或 PIL 方面可能发生了某些变化,转换为 NumPy 数组。无论如何,您都需要创建一个 2D 视图:

np_img = np.array(rgba_img)

np_img2d = np_img.view("uint32").reshape(np_img.shape[:2])

fig = figure()
plotted_image = fig.image_rgba(image=[np_img2d], x=50, y=50, dw=50, dh=50)

推荐阅读