Holoviews QuadMesh 边缘不透明度

Holoviews QuadMesh edge opacity

问题描述:

当使用 HoloViews 中的 QuadMesh 图时,即使使用 line_alpha=0, line_width=0.

等选项,也可以观察到所有四边形图块之间的白线

这些明显的线条实际上是四边形之间的间隙,因为如果替换 `bgcolor='black') 线条将显示为黑色。

通过 linea_alpha=1, line_width=1, line_color='m' 启用线条将用洋红色线条绘制空白。

问题

是否可以消除这些线条?如果可以,我应该怎么做?

这在曲线平铺的情况下可能不是什么大问题,但我的实际数据导致轴平行平铺和令人难以置信的丑陋的锯齿伪像(我不能使用 Image,因为数据不是等距的)。

最小工作示例

将是上面引用的 HoloViews 库中的默认示例:

import numpy as np
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

n = 20
coords = np.linspace(-1.5, 1.5, n)
X,Y = np.meshgrid(coords, coords);
Qx = np.cos(Y) - np.cos(X)
Qz = np.sin(Y) + np.sin(X)
Z = np.sqrt(X**2 + Y**2)

qmesh = hv.QuadMesh((Qx, Qz, Z))

#plot default
qmesh

#plot with black background and magenta lines
qmesh.opts(line_alpha=1, line_width=1, line_color='m', bgcolor='black')

您无法删除它们。

holoviews QuadMesh 构建不规则网格 bokeh Patches glyphs

从 bokeh 2.4.2 开始,它以某种方式在相邻补丁之间有 built-in 间隙,如该小示例代码所示:

import numpy as np

from bokeh.models import ColumnDataSource, Patches
from bokeh.plotting import figure
from bokeh.io import show

xpts = np.array([0, 0, 1, 1])
ypts = np.array([0, 1, 1, 0])

source = ColumnDataSource(dict(
        xs=np.array([(xpts+j) for i in range(5) for j in range(5)]),
        ys=np.array([ypts+i for i in range(5) for j in range(5)]),
    )
)

fig = figure(
    title=None, width=300, height=300,
    min_border=0,background_fill_color="red")

glyph = Patches(xs="xs", ys="ys", fill_color="white",line_width=0)
fig.add_glyph(source, glyph)
fig.ygrid.visible = False
fig.xgrid.visible = False
show(fig)

因此,如果您使用带有散景的全息 QuadMesh 来绘制例如具有许多补丁的高分辨率数据,您缩小的地图颜色将看起来全部褪色,因为补丁之间的所有这些间隙线让背景颜色通过:

import numpy as np
from bokeh.models import ColumnDataSource, Patches
from bokeh.plotting import figure
from bokeh.io import show
from bokeh.palettes import viridis
import random

xpts = np.array([0, 0, 1, 1])
ypts = np.array([0, 1, 1, 0])

nx = 1000
ny = 500
colors = viridis(24)
source = ColumnDataSource(data=dict(
xs=np.array([(xpts+j) for i in range(ny) for j in range(nx)]),
ys=np.array([ypts+i for i in range(ny) for j in range(nx)]),
colors=np.array([random.choice(colors) for i in range(nx*ny)])
))

fig = figure(
    title=None, width=300, height=300,
    min_border=0)


glyph = Patches(xs="xs", ys='ys', fill_color='colors',line_width=0)
fig.add_glyph(source,glyph)
fig.ygrid.visible = False
fig.xgrid.visible = False
show(fig)

与使用 matplotlib 的 pcolormesh 生成的类似地图进行比较,看看颜色应该更加鲜艳:

import matplotlib.pyplot as plt
mpl_fig,ax = plt.subplots()
zz = np.random.rand(ny,nx)
ax.pcolormesh(zz)
plt.show(mpl_fig)

我在散景 github 上开了一个问题:https://github.com/bokeh/bokeh/issues/12085