При использовании графика QuadMesh
в HoloViews можно наблюдать белые линии между всеми четырехугольными плитками, даже при использовании таких параметров, как 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 строит нерегулярные сетки с боке Патчи глифы
Начиная с боке 2.4.2, оно каким-то образом имеет встроенные промежутки между соседними патчами, что можно увидеть в этом небольшом примере кода:
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)
Поэтому, если вы используете holoview 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)
Сравните с аналогичной картой, созданной с помощью pcolormesh от matplotlib, чтобы увидеть, насколько ярче должны быть цвета:
import matplotlib.pyplot as plt
mpl_fig,ax = plt.subplots()
zz = np.random.rand(ny,nx)
ax.pcolormesh(zz)
plt.show(mpl_fig)
Я открыл тему на гитхабе боке: https://github.com/bokeh/bokeh/issues/12085
Спасибо за объяснение и проблему! Я тоже заподозрил проблему с боке, попробовав ее с бэкэндом Matplotlib, но, учитывая предварительное обсуждение в комментариях (теперь ушло), не был уверен, может ли проблема быть связана с тем, как обрабатывается BokehJS.
Вышеприведенное было создано с помощью
1.14.6
в блокноте Jupyter, а также в консоли IPython с использованием Python 3. Мне удалось воспроизвести проблему на двух разных машинах с использованием Python 3.6.15 и 3.6.5, а также Bokeh 2.3.1 и 2.3. .3.