python - 从 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()
解决方案
错误在浏览器的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)
推荐阅读
- javascript - 在Javascript中获取从0到10000的所有二进制数字(1,10,11,100等)
- angular - 带 Jhipster 的 Angular Toastr
- arrays - 使用坐标数组将折线添加到地图
- r - R在2列上选择行的数据框中获取最小值
- image - 找不到 Directus 8 缩略图路径
- flutter - ListView.builder 中的 SwitchListTile 和 Container 或 RaisedButton 无法正常工作
- json - 将(几乎)json序列化为.NET对象
- dynamics-crm - 与 Teams 通话的 Dynamics 365 V9
- azure-devops - 天蓝色管道 - 如何将证书传递给管道代理
- python - 在 DataFrameMapper 中显式删除列