holoviews icon indicating copy to clipboard operation
holoviews copied to clipboard

`match_aspect` parameter for bokeh's `BoxZoomTool` is not working

Open MP-MaximilianLattka opened this issue 9 months ago • 4 comments

ALL software version info

Python: 3.11.9 JupyterLab: 4.1.5 Holoviews: 1.18.3 Bokeh: 3.3.4 and 3.4.1

Description of expected behavior and the observed behavior

I’ve been plotting map data using holoviews and geoviews with the bokeh backend.

Bokeh has a zoom tool called BoxZoomTool, which allows drawing a rectangle to zoom in. Setting the kwarg match_aspect=True results in maintaining the aspect ratio, which is meaningful when working with maps. Apparently, holoviews doesn’t properly use pass the BoxZoomTool to bokeh as match_aspect=True does not have any effect.

Complete, minimal, self-contained example code that reproduces the issue

Working BoxZoomTool with native bokeh only (version 3.4.1 and 3.3.4, both working as expected)
import bokeh
from bokeh.plotting import figure, show
from bokeh.models import BoxZoomTool

print(f"{bokeh.__version__=}")

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
counts = [5, 3, 4, 2, 4, 6]

box_zoom = BoxZoomTool(match_aspect=True)

p = figure(x_range=fruits, height=350, title="Fruit Counts",
           toolbar_location=None, tools=[box_zoom])

p.vbar(x=fruits, top=counts, width=0.9)

p.xgrid.grid_line_color = None
p.y_range.start = 0

show(p)
Non-working holoviews code (version 1.18.3)
import numpy as np
import holoviews as hv
from bokeh.models import BoxZoomTool

hv.extension("bokeh")

print(f"{hv.__version__=}")


x,y = np.mgrid[-50:51, -50:51] * 0.1

box_zoom = BoxZoomTool(match_aspect=True)

img = hv.Image(np.sin(x**2+y**2), bounds=(-1,-1,1,1))

(img.relabel('Image') * img.sample(x=0).relabel('Cross-section')).opts(
    tabs=True,
    tools=[box_zoom])
Non-working minimal example of my code (version 1.18.3)
data = [{
    'STATENAME': 'District of Columbia',
    'LAT': (-77.035264, -76.909294, -77.040741, -77.117418, -77.035264),
    'LONG': (38.993869, 38.895284, 38.791222, 38.933623, 38.993869)
}]

box_zoom = BoxZoomTool(match_aspect=True)

tiles = hv.Tiles("https://tile.openstreetmap.org/{Z}/{X}/{Y}.png", name="OSM").opts(
    #"Image", # Does not respect width and height parameter
    width=1400,
    height=800,
    #tools=[box_zoom], # This alone does not preserve match_aspect=True
)

choropleth = gv.Polygons(data, ["LAT", "LONG"], ["STATENAME"]).opts(
    #"Image", # Incompatible with line_color parameter
    xaxis=None,
    yaxis=None,
    line_color="black",
    cmap="bwr",
    alpha=1.0,
    #tools=[box_zoom], # This alone does not preserve match_aspect=True
)
(tiles * choropleth).opts(
    #"Image",
    #tools=[box_zoom], # This alone does not preserve match_aspect=True
)

Stack traceback and/or browser JavaScript console output

Screenshots or screencasts of the bug in action

  • [ ] I may be interested in making a pull request to address this

MP-MaximilianLattka avatar Apr 26 '24 14:04 MP-MaximilianLattka