我一直在使用Web应用程序在Python中使用Bokeh生成图像,并且在制作具有非均匀像素宽度的图像时遇到了问题。我想要的行为类型与NonUniformImage
模块中的matplotlib.image
函数类似,但我希望它在浏览器中是交互式的,这就是我使用Bokeh的原因。
我要绘制的数据在垂直方向上具有固定的像素宽度,但每列可以具有不同的像素宽度。现在,我能够弄清楚如何在图像绘图中创建可变宽度列的唯一方法是将每列切割成自己的图像,并将它们全部绘制为具有适当宽度的单独图像。虽然这确实绘制了我想要的宽度的东西,但是在每个像素之间存在渲染问题,其中白线显示取决于缩放级别。这些白线也将转换为保存的图像。我在下面写了一些示例代码:
import numpy as np
from bokeh.models import Range1d
from bokeh.plotting import figure, show, output_file
# Sample Data
img = np.array([[(x/10.*255,y/10.*255,100,255) for x in range(10)] for y in range(10)])
# Convert to RGBA array that can be plotted
d = np.empty((10, 10), dtype=np.uint32)
view = d.view(dtype=np.uint8).reshape((10, 10, 4))
view[:,:,:] = img
# Set output file
output_file("image.html", title="image.py example")
# Setup the figure
rng = Range1d(0,10,bounds='auto')
p = figure(x_range=rng, y_range=rng, plot_width=500, plot_height=500,active_scroll='wheel_zoom')
# Slice the images
imgs = [d[:,n:n+1] for n in range(10)]
dhs = [10 for n in range(10)]
ys = [0 for n in range(10)]
dws = [0.5 if n%2 == 0 else 1.5 for n in range(10)]
xs = [sum(dws[:n]) for n in range(10)]
# Plot the image
p.image_rgba(image=imgs, x=xs, y=ys, dw=dws, dh=dhs)
show(p)
现在,我的实际数据比这个样本数据更密集,因此渲染由白色垂直线支配。如果放大得足够远,可以看到像素彼此相邻。
所以,我的问题如下:是否有更好的方法在Bokeh中绘制非均匀图像?可以采用每个像素的x,y位置信息的东西将是优选的。或者,有没有一种方法可以让渲染更好地使用此方法来避免白色条纹?
编辑:似乎如果我给像素一些重叠,那么它就会摆脱条纹。但是有一个限制,重叠需要足够大,这似乎是一种非常粗略的做事方式。我会更多地考虑这一点,因为它可能是一种解决方法,但我希望有一个更合理的解决方案。