hvplot 0.11.0a1__tar.gz → 0.11.0a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/docs.yaml +0 -4
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/test.yaml +4 -2
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/PKG-INFO +6 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/conftest.py +21 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/installation.md +1 -1
- hvplot-0.11.0a2/doc/reference/xarray/vectorfield.ipynb +230 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Customization.ipynb +15 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Geographic_Data.ipynb +16 -14
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_with_Matplotlib.ipynb +39 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Timeseries_Data.ipynb +27 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.10-tests.yaml +3 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.11-docs.yaml +1 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.11-tests.yaml +3 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.12-tests.yaml +3 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.9-tests.yaml +2 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/__init__.py +28 -2
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/_version.py +1 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/converter.py +72 -7
- hvplot-0.11.0a2/hvplot/cudf.py +30 -0
- hvplot-0.11.0a2/hvplot/dask.py +46 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/fugue.py +8 -4
- hvplot-0.11.0a2/hvplot/ibis.py +25 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/intake.py +9 -5
- hvplot-0.11.0a2/hvplot/pandas.py +33 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/polars.py +6 -4
- hvplot-0.11.0a2/hvplot/streamz.py +24 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testcore.py +0 -13
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testcharts.py +16 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgeo.py +9 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgeowithoutgv.py +8 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgridplots.py +7 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoptions.py +15 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testplotting.py +0 -12
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testutil.py +25 -3
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/util.py +1 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/xarray.py +7 -5
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/PKG-INFO +6 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/SOURCES.txt +1 -1
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/requires.txt +9 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/pyproject.toml +5 -0
- hvplot-0.11.0a1/doc/reference/xarray/vectorfield.ipynb +0 -126
- hvplot-0.11.0a1/hvplot/cudf.py +0 -26
- hvplot-0.11.0a1/hvplot/dask.py +0 -42
- hvplot-0.11.0a1/hvplot/ibis.py +0 -21
- hvplot-0.11.0a1/hvplot/pandas.py +0 -30
- hvplot-0.11.0a1/hvplot/streamz.py +0 -21
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.git-blame-ignore-revs +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.git_archival.txt +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.gitattributes +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/CONTRIBUTING.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/FUNDING.yml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/build.yaml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.gitignore +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.pre-commit-config.yaml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/CHANGELOG.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/CODE_OF_CONDUCT.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/LICENSE +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/README.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/binder/environment.yml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/binder/postBuild +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/conda.recipe/meta.yaml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/custom.css +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/favicon.ico +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/bokeh.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/dask.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/explorer.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/geo.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/geopandas.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/intake.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_hvplot.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_pandas.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_xarray.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/large_data.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/layout.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/matplotlib.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/networkx.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/overlay.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/pandas.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/plotly.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/widgets.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/xarray.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/images/heat_and_trees.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/images/portfolio.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo_horizontal.svg +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo_stacked.svg +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/about.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/console.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/console_server.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/diagram.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/diagram.svg +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/hvplot-wm.png +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/streamz_demo.gif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/conf.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/developer_guide/index.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/explorer.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/hvplot.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/index.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/interactive.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/CONTRIBUTING.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/GOVERNANCE.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/LICENSE.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/MEMBERS.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/index.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/geopandas/points.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/geopandas/polygons.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/andrewscurves.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/area.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/bar.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/barh.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/bivariate.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/box.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/errorbars.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/heatmap.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/hexbin.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/hist.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/kde.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/labels.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/lagplot.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/line.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/ohlc.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/parallelcoordinates.ipynb +0 -0
- {hvplot-0.11.0a1/doc/reference/pandas → hvplot-0.11.0a2/doc/reference/tabular}/paths.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/scatter.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/scattermatrix.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/step.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/table.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/violin.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/bar.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/contour.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/contourf.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/hist.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/image.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/kde.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/line.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/quadmesh.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/rgb.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/violin.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/releases.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/roadmap.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/topics.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Explorer.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Gridded_Data.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Integrations.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Interactive.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Introduction.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Large_Timeseries.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/NetworkX.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Pandas_API.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_Extensions.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_with_Plotly.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Statistical_Plots.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Streaming.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Subplots.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Viewing.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Widgets.ipynb +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/images/simple.svg +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/index.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/backend_transforms.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/data/crime.csv +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/datasets.yaml +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/interactive.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/networkx.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/__init__.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/andrews_curves.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/core.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/lag_plot.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/parallel_coordinates.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/scatter_matrix.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/sample_data.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/__init__.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/conftest.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/data/README.md +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/data/RGB-red.byte.tif +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/__init__.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testohlc.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testscattermatrix.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/test_links.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testbackend_transforms.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testfugue.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testhelp.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testibis.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testinteractive.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testnetworkx.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoperations.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoverrides.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testpanel.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testpatch.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/teststatplots.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/teststreaming.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testtransforms.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testui.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/util.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/ui.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/utilities.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/dependency_links.txt +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/entry_points.txt +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/top_level.txt +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/scripts/update_conda_envs.py +0 -0
- {hvplot-0.11.0a1 → hvplot-0.11.0a2}/setup.cfg +0 -0
|
@@ -50,8 +50,6 @@ jobs:
|
|
|
50
50
|
run: |
|
|
51
51
|
echo "Deploying from ref ${GITHUB_REF#refs/*/}"
|
|
52
52
|
echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
53
|
-
- name: bokeh sampledata
|
|
54
|
-
run: bokeh sampledata
|
|
55
53
|
- name: install dev nbsite
|
|
56
54
|
run: pip install --pre -U nbsite
|
|
57
55
|
- name: conda info
|
|
@@ -115,8 +113,6 @@ jobs:
|
|
|
115
113
|
run: |
|
|
116
114
|
echo "Deploying from ref ${GITHUB_REF#refs/*/}"
|
|
117
115
|
echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
|
|
118
|
-
- name: bokeh sampledata
|
|
119
|
-
run: bokeh sampledata
|
|
120
116
|
- name: build docs
|
|
121
117
|
run: sphinx-build -b html doc builtdocs
|
|
122
118
|
- name: report failure
|
|
@@ -132,13 +132,14 @@ jobs:
|
|
|
132
132
|
- name: conda list
|
|
133
133
|
run: conda list
|
|
134
134
|
- name: bokeh sampledata
|
|
135
|
+
if: ${{ matrix.python-version == '3.9'}}
|
|
135
136
|
run: bokeh sampledata
|
|
136
137
|
- name: unit tests
|
|
137
138
|
run: pytest -v hvplot --cov=hvplot --cov-append
|
|
138
139
|
- name: unit tests geo
|
|
139
140
|
run: pytest -v hvplot --geo --cov=hvplot --cov-append
|
|
140
141
|
- name: examples tests
|
|
141
|
-
run: pytest -n
|
|
142
|
+
run: pytest -n logical --dist loadscope --nbval-lax -p no:python
|
|
142
143
|
pip_test:
|
|
143
144
|
name: pip tests:${{ matrix.os }}:${{ matrix.python-version }}
|
|
144
145
|
needs: [pre_commit, setup]
|
|
@@ -162,13 +163,14 @@ jobs:
|
|
|
162
163
|
- name: pip list
|
|
163
164
|
run: pip list
|
|
164
165
|
- name: bokeh sampledata
|
|
166
|
+
if: ${{ matrix.python-version == '3.9'}}
|
|
165
167
|
run: bokeh sampledata
|
|
166
168
|
- name: unit tests
|
|
167
169
|
run: pytest -v hvplot --cov=hvplot --cov-append
|
|
168
170
|
- name: unit tests geo
|
|
169
171
|
run: pytest -v hvplot --geo --cov=hvplot --cov-append
|
|
170
172
|
- name: examples tests
|
|
171
|
-
run: pytest -n
|
|
173
|
+
run: pytest -n logical --dist loadscope --nbval-lax -p no:python
|
|
172
174
|
- name: Upload coverage reports to Codecov
|
|
173
175
|
if: github.event_name == 'push' || github.event_name == 'pull_request'
|
|
174
176
|
uses: codecov/codecov-action@v4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: hvplot
|
|
3
|
-
Version: 0.11.
|
|
3
|
+
Version: 0.11.0a2
|
|
4
4
|
Summary: A high-level plotting API for the PyData ecosystem built on HoloViews.
|
|
5
5
|
Author-email: Philipp Rudiger <developers@holoviz.org>
|
|
6
6
|
Maintainer-email: HoloViz developers <developers@holoviz.org>
|
|
@@ -44,12 +44,16 @@ Requires-Dist: pytest; extra == "tests-core"
|
|
|
44
44
|
Requires-Dist: ruff; extra == "tests-core"
|
|
45
45
|
Requires-Dist: scipy; extra == "tests-core"
|
|
46
46
|
Requires-Dist: xarray; extra == "tests-core"
|
|
47
|
+
Requires-Dist: bokeh_sampledata; python_version >= "3.10" and extra == "tests-core"
|
|
48
|
+
Requires-Dist: psutil; extra == "tests-core"
|
|
47
49
|
Provides-Extra: tests
|
|
48
50
|
Requires-Dist: hvplot[tests-core]; extra == "tests"
|
|
49
51
|
Requires-Dist: fugue[sql]; extra == "tests"
|
|
50
52
|
Requires-Dist: hvplot[fugue-sql]; extra == "tests"
|
|
51
53
|
Requires-Dist: ibis-framework[duckdb]; extra == "tests"
|
|
52
54
|
Requires-Dist: polars; extra == "tests"
|
|
55
|
+
Requires-Dist: dask; extra == "tests"
|
|
56
|
+
Requires-Dist: spatialpandas; extra == "tests"
|
|
53
57
|
Provides-Extra: fugue-sql
|
|
54
58
|
Requires-Dist: qpd>=0.4.4; extra == "fugue-sql"
|
|
55
59
|
Requires-Dist: fugue-sql-antlr>=0.2.0; extra == "fugue-sql"
|
|
@@ -92,6 +96,7 @@ Requires-Dist: streamz>=0.3.0; extra == "examples"
|
|
|
92
96
|
Requires-Dist: xarray>=0.18.2; extra == "examples"
|
|
93
97
|
Requires-Dist: xyzservices>=2022.9.0; extra == "examples"
|
|
94
98
|
Requires-Dist: geodatasets>=2023.12.0; extra == "examples"
|
|
99
|
+
Requires-Dist: bokeh_sampledata; python_version >= "3.10" and extra == "examples"
|
|
95
100
|
Provides-Extra: tests-nb
|
|
96
101
|
Requires-Dist: pytest-xdist; extra == "tests-nb"
|
|
97
102
|
Requires-Dist: nbval; extra == "tests-nb"
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import dask
|
|
2
1
|
from importlib.util import find_spec
|
|
2
|
+
|
|
3
|
+
import dask
|
|
4
|
+
|
|
5
|
+
from packaging.version import Version
|
|
3
6
|
from bokeh.io.webdriver import webdriver_control
|
|
4
7
|
|
|
8
|
+
|
|
5
9
|
collect_ignore_glob = [
|
|
6
10
|
'user_guide/Streaming.ipynb',
|
|
7
11
|
]
|
|
@@ -45,3 +49,19 @@ finally:
|
|
|
45
49
|
# From Dask 2024.3.0 they now use `dask_expr` by default
|
|
46
50
|
# https://github.com/dask/dask/issues/10995
|
|
47
51
|
dask.config.set({'dataframe.query-planning': False})
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# https://github.com/pydata/xarray/pull/9182
|
|
55
|
+
try:
|
|
56
|
+
import xarray as xr
|
|
57
|
+
except ImportError:
|
|
58
|
+
pass
|
|
59
|
+
else:
|
|
60
|
+
import numpy as np
|
|
61
|
+
|
|
62
|
+
if Version(np.__version__) >= Version('2.0.0') and Version(xr.__version__) <= Version(
|
|
63
|
+
'2024.6.0'
|
|
64
|
+
):
|
|
65
|
+
collect_ignore_glob += [
|
|
66
|
+
'user_guide/Gridded_Data.ipynb',
|
|
67
|
+
]
|
|
@@ -13,7 +13,7 @@ or with `pip`:
|
|
|
13
13
|
|
|
14
14
|
pip install hvplot
|
|
15
15
|
|
|
16
|
-
For versions of `jupyterlab>=3.0` the necessary extension is automatically bundled in the `pyviz_comms` package, which must be >=2.0. However note that for version of `jupyterlab<3.0` you must also manually install the JupyterLab extension with:
|
|
16
|
+
Note that `hvplot` needs to run in a Jupyter environment to automatically show output plots. However, if you are using a raw Python or IPython console, it is still possible to [show the plots](https://hvplot.holoviz.org/user_guide/Viewing.html#python-command-prompt-scripts) with `hvplot.show()` or [save the plots](https://hvplot.holoviz.org/user_guide/Viewing.html#saving-plots) even if you cannot view them interactively. For versions of `jupyterlab>=3.0` the necessary extension is automatically bundled in the `pyviz_comms` package, which must be >=2.0. However note that for version of `jupyterlab<3.0` you must also manually install the JupyterLab extension with:
|
|
17
17
|
|
|
18
18
|
conda install jupyterlab
|
|
19
19
|
jupyter labextension install @pyviz/jupyterlab_pyviz
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"metadata": {},
|
|
6
|
+
"source": [
|
|
7
|
+
"# Vectorfield"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"cell_type": "code",
|
|
12
|
+
"execution_count": null,
|
|
13
|
+
"metadata": {},
|
|
14
|
+
"outputs": [],
|
|
15
|
+
"source": [
|
|
16
|
+
"import hvplot.xarray # noqa"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"cell_type": "markdown",
|
|
21
|
+
"metadata": {},
|
|
22
|
+
"source": [
|
|
23
|
+
"`vectorfield` accepts 2d arrays of magnitude and angle on a grid and produces an array of vectors. x and y can be 2d or 1d coordinates. "
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"cell_type": "code",
|
|
28
|
+
"execution_count": null,
|
|
29
|
+
"metadata": {},
|
|
30
|
+
"outputs": [],
|
|
31
|
+
"source": [
|
|
32
|
+
"import numpy as np\n",
|
|
33
|
+
"import xarray as xr\n",
|
|
34
|
+
"import holoviews as hv\n",
|
|
35
|
+
"import cartopy.crs as ccrs"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"cell_type": "code",
|
|
40
|
+
"execution_count": null,
|
|
41
|
+
"metadata": {},
|
|
42
|
+
"outputs": [],
|
|
43
|
+
"source": [
|
|
44
|
+
"def sample_data(shape=(20, 30)):\n",
|
|
45
|
+
" \"\"\"\n",
|
|
46
|
+
" Return ``(x, y, u, v, crs)`` of some vector data\n",
|
|
47
|
+
" computed mathematically. The returned crs will be a rotated\n",
|
|
48
|
+
" pole CRS, meaning that the vectors will be unevenly spaced in\n",
|
|
49
|
+
" regular PlateCarree space.\n",
|
|
50
|
+
"\n",
|
|
51
|
+
" \"\"\"\n",
|
|
52
|
+
" crs = ccrs.RotatedPole(pole_longitude=177.5, pole_latitude=37.5)\n",
|
|
53
|
+
"\n",
|
|
54
|
+
" x = np.linspace(311.9, 391.1, shape[1])\n",
|
|
55
|
+
" y = np.linspace(-23.6, 24.8, shape[0])\n",
|
|
56
|
+
"\n",
|
|
57
|
+
" x2d, y2d = np.meshgrid(x, y)\n",
|
|
58
|
+
" u = 10 * (2 * np.cos(2 * np.deg2rad(x2d) + 3 * np.deg2rad(y2d + 30)) ** 2)\n",
|
|
59
|
+
" v = 20 * np.cos(6 * np.deg2rad(x2d))\n",
|
|
60
|
+
"\n",
|
|
61
|
+
" return x, y, u, v, crs\n",
|
|
62
|
+
"\n",
|
|
63
|
+
"xs, ys, U, V, crs = sample_data()\n",
|
|
64
|
+
"\n",
|
|
65
|
+
"mag = np.sqrt(U**2 + V**2)\n",
|
|
66
|
+
"angle = (np.pi/2.) - np.arctan2(U/mag, V/mag)\n",
|
|
67
|
+
"\n",
|
|
68
|
+
"ds = xr.Dataset({'mag': xr.DataArray(mag, dims=('y', 'x'), coords={'y': ys, 'x': xs}),\n",
|
|
69
|
+
" 'angle': xr.DataArray(angle, dims=('y', 'x'), coords={'y': ys, 'x': xs})}, \n",
|
|
70
|
+
" attrs={'crs': crs})\n",
|
|
71
|
+
"ds"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"cell_type": "code",
|
|
76
|
+
"execution_count": null,
|
|
77
|
+
"metadata": {},
|
|
78
|
+
"outputs": [],
|
|
79
|
+
"source": [
|
|
80
|
+
"ds.hvplot.vectorfield(x='x', y='y', angle='angle', mag='mag', hover=False).opts(magnitude='mag')"
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"cell_type": "markdown",
|
|
85
|
+
"metadata": {},
|
|
86
|
+
"source": [
|
|
87
|
+
"## Geographic Data\n",
|
|
88
|
+
"If a dataset has an attr called `crs` which is a cartopy object or a proj4 string, then just by setting the option `geo=True` will use the correct crs."
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"cell_type": "code",
|
|
93
|
+
"execution_count": null,
|
|
94
|
+
"metadata": {},
|
|
95
|
+
"outputs": [],
|
|
96
|
+
"source": [
|
|
97
|
+
"ds.hvplot.vectorfield(x='x', y='y', angle='angle', mag='mag',\n",
|
|
98
|
+
" hover=False, geo=True, tiles=\"CartoLight\")"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"cell_type": "markdown",
|
|
103
|
+
"metadata": {},
|
|
104
|
+
"source": [
|
|
105
|
+
"If you set `coastline` or `features` it will keep the original crs and transform the features to the data crs."
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"cell_type": "code",
|
|
110
|
+
"execution_count": null,
|
|
111
|
+
"metadata": {},
|
|
112
|
+
"outputs": [],
|
|
113
|
+
"source": [
|
|
114
|
+
"ds.hvplot.vectorfield(x='x', y='y', angle='angle', mag='mag',\n",
|
|
115
|
+
" hover=False, geo=True, coastline=True)"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"cell_type": "markdown",
|
|
120
|
+
"metadata": {},
|
|
121
|
+
"source": [
|
|
122
|
+
"## Large Data"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"cell_type": "markdown",
|
|
127
|
+
"metadata": {},
|
|
128
|
+
"source": [
|
|
129
|
+
"The visualization of vector fields from large datasets often presents a challenge. Direct plotting methods can quickly consume excessive memory, leading to crashes or unresponsive applications. To address this issue, we introduce a dynamic downsampling technique that enables interactive exploration of vector fields without sacrificing performance. We first create a `sample_data` that contains 4,000,000 points."
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"cell_type": "code",
|
|
134
|
+
"execution_count": null,
|
|
135
|
+
"metadata": {},
|
|
136
|
+
"outputs": [],
|
|
137
|
+
"source": [
|
|
138
|
+
"xs, ys, U, V, crs = sample_data(shape=(2000, 2000))\n",
|
|
139
|
+
"\n",
|
|
140
|
+
"mag = np.sqrt(U**2 + V**2)\n",
|
|
141
|
+
"angle = (np.pi/2.) - np.arctan2(U/mag, V/mag)\n",
|
|
142
|
+
"\n",
|
|
143
|
+
"ds = xr.Dataset({'mag': xr.DataArray(mag, dims=('y', 'x'), coords={'y': ys, 'x': xs}),\n",
|
|
144
|
+
" 'angle': xr.DataArray(angle, dims=('y', 'x'), coords={'y': ys, 'x': xs})}, \n",
|
|
145
|
+
" attrs={'crs': crs})\n",
|
|
146
|
+
"ds"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"cell_type": "markdown",
|
|
151
|
+
"metadata": {},
|
|
152
|
+
"source": [
|
|
153
|
+
"If we just try to call `ds.hvplot.vectorfield` this is probably returning `MemoryError`. The alternative is to dynamically downsample the data based on the visible range. This helps manage memory consumption when dealing with large datasets, especially when plotting vector fields. We are going to use HoloViews to create a view (`hv.DynamicMap`) whose content is dynamically updated based on the data range displayed (tracked by the `hv.streams.RangeXY` stream), [find out more about these concepts](https://holoviews.org/user_guide/Custom_Interactivity.html)."
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"cell_type": "code",
|
|
158
|
+
"execution_count": null,
|
|
159
|
+
"metadata": {},
|
|
160
|
+
"outputs": [],
|
|
161
|
+
"source": [
|
|
162
|
+
"def downsample_quiver(x_range=None, y_range=None, nmax=10):\n",
|
|
163
|
+
" \"\"\"\n",
|
|
164
|
+
" Creates a HoloViews vector field plot from a dataset, dynamically downsampling \n",
|
|
165
|
+
" data based on the visible range to optimize memory usage.\n",
|
|
166
|
+
"\n",
|
|
167
|
+
" Args:\n",
|
|
168
|
+
" x_range (tuple, optional): Range of x values to include. Defaults to None (full range).\n",
|
|
169
|
+
" y_range (tuple, optional): Range of y values to include. Defaults to None (full range).\n",
|
|
170
|
+
" nmax (int, optional): Maximum number of points along each axis after coarsening. \n",
|
|
171
|
+
" Defaults to 10.\n",
|
|
172
|
+
"\n",
|
|
173
|
+
" Returns:\n",
|
|
174
|
+
" HoloViews DynamicMap: A dynamic vector field plot that updates based on the visible range.\n",
|
|
175
|
+
" \"\"\"\n",
|
|
176
|
+
"\n",
|
|
177
|
+
" if x_range is None or y_range is None:\n",
|
|
178
|
+
" # No range provided, downsample the entire dataset for initial display\n",
|
|
179
|
+
" xs, ys = ds.x.size, ds.y.size # Get dataset dimensions\n",
|
|
180
|
+
" ix, iy = xs // nmax, ys // nmax # Calculate downsampling intervals\n",
|
|
181
|
+
"\n",
|
|
182
|
+
" ix = max(1, ix) # Ensure interval is at least 1\n",
|
|
183
|
+
" iy = max(1, iy)\n",
|
|
184
|
+
"\n",
|
|
185
|
+
" sub = ds.coarsen(x=ix, y=iy, side=\"center\", boundary=\"trim\").mean() # Downsample\n",
|
|
186
|
+
" else:\n",
|
|
187
|
+
" # Select data within the specified range\n",
|
|
188
|
+
" sub = ds.sel(x=slice(*x_range), y=slice(*y_range))\n",
|
|
189
|
+
"\n",
|
|
190
|
+
" # Downsample the selected data\n",
|
|
191
|
+
" xs, ys = sub.x.size, sub.y.size\n",
|
|
192
|
+
" ix, iy = xs // nmax, ys // nmax\n",
|
|
193
|
+
" ix = max(1, ix)\n",
|
|
194
|
+
" iy = max(1, iy)\n",
|
|
195
|
+
" sub = sub.coarsen(x=ix, y=iy, side=\"center\", boundary=\"trim\").mean()\n",
|
|
196
|
+
"\n",
|
|
197
|
+
" # Create the vector field plot\n",
|
|
198
|
+
" quiver = sub.hvplot.vectorfield(\n",
|
|
199
|
+
" x=\"x\",\n",
|
|
200
|
+
" y=\"y\",\n",
|
|
201
|
+
" mag=\"mag\",\n",
|
|
202
|
+
" angle=\"angle\",\n",
|
|
203
|
+
" hover=False,\n",
|
|
204
|
+
" ).opts(magnitude=\"mag\")\n",
|
|
205
|
+
"\n",
|
|
206
|
+
" return quiver"
|
|
207
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"cell_type": "code",
|
|
211
|
+
"execution_count": null,
|
|
212
|
+
"metadata": {},
|
|
213
|
+
"outputs": [],
|
|
214
|
+
"source": [
|
|
215
|
+
"# Create interactive plot components\n",
|
|
216
|
+
"range_xy = hv.streams.RangeXY() # Stream to capture range changes\n",
|
|
217
|
+
"filtered = hv.DynamicMap(downsample_quiver, streams=[range_xy]) # Dynamic plot\n",
|
|
218
|
+
"filtered # Display the plot"
|
|
219
|
+
]
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"metadata": {
|
|
223
|
+
"language_info": {
|
|
224
|
+
"name": "python",
|
|
225
|
+
"pygments_lexer": "ipython3"
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"nbformat": 4,
|
|
229
|
+
"nbformat_minor": 4
|
|
230
|
+
}
|
|
@@ -66,6 +66,16 @@
|
|
|
66
66
|
" hover_cols (default=[]): list or str\n",
|
|
67
67
|
" Additional columns to add to the hover tool or 'all' which will\n",
|
|
68
68
|
" includes all columns (including indexes if use_index is True).\n",
|
|
69
|
+
" hover_tooltips list[str] or list[tuple]:\n",
|
|
70
|
+
" A list of dimensions to be displayed in the hover tooltip. See\n",
|
|
71
|
+
" [HoloViews docs](https://holoviews.org/user_guide/Plotting_with_Bokeh.html#hover-tools)\n",
|
|
72
|
+
" or [Bokeh docs](https://docs.bokeh.org/en/latest/docs/user_guide/interaction/tools.html#hovertool)\n",
|
|
73
|
+
" for more info on structuring.\n",
|
|
74
|
+
" hover_formatters:\n",
|
|
75
|
+
" A dict of formatting options for the hover tooltip.\n",
|
|
76
|
+
" hover_mode (default='mouse'):\n",
|
|
77
|
+
" The hover mode determines how the hover tool is activated;\n",
|
|
78
|
+
" select from 'mouse', 'vline', or 'hline'.\n",
|
|
69
79
|
" invert (default=False): boolean\n",
|
|
70
80
|
" Swaps x- and y-axis\n",
|
|
71
81
|
" frame_width/frame_height: int\n",
|
|
@@ -104,6 +114,10 @@
|
|
|
104
114
|
" rot: number\n",
|
|
105
115
|
" Rotates the axis ticks along the x-axis by the specified\n",
|
|
106
116
|
" number of degrees.\n",
|
|
117
|
+
" subcoordinate_y: bool or dict\n",
|
|
118
|
+
" Whether to enable sub-coordinate y systems for this plot. Accepts also a\n",
|
|
119
|
+
" dictionary of related options to pass down to HoloViews,\n",
|
|
120
|
+
" e.g. `{'subcoordinate_scale': 2}`.\n",
|
|
107
121
|
" shared_axes (default=True): boolean\n",
|
|
108
122
|
" Whether to link axes between plots\n",
|
|
109
123
|
" transforms (default={}): dict\n",
|
|
@@ -229,7 +243,7 @@
|
|
|
229
243
|
" projection (default=None):\n",
|
|
230
244
|
" Coordinate reference system of the plot (output projection) specified as a string or integer EPSG code, a CRS or Proj pyproj object, a Cartopy CRS object or class name, a WKT string, or a proj.4 string. Defaults to PlateCarree.\n",
|
|
231
245
|
" tiles (default=False):\n",
|
|
232
|
-
" Whether to overlay the plot on a tile source. Tiles sources\n",
|
|
246
|
+
" Whether to overlay the plot on a tile source. If coordinate values fall within lat/lon bounds, auto-projects to EPSG:3857 unless `projection=False`. Tiles sources\n",
|
|
233
247
|
" can be selected by name or a tiles object or class can be passed,\n",
|
|
234
248
|
" the default is 'Wikipedia'.\n",
|
|
235
249
|
" tiles_opts (default=None): dict\n",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"source": [
|
|
61
61
|
"## Tiled web map\n",
|
|
62
62
|
"\n",
|
|
63
|
-
"A [tiled web map](https://en.wikipedia.org/wiki/Tiled_web_map), or tile map, is an interactive map displayed on a web browser that is divided into small, pre-rendered image tiles, allowing for efficient loading and seamless navigation across various zoom levels and geographic areas. hvPlot allows to add a tile map as a basemap to a plot with the `tiles` parameter. Importantly, `tiles` is a parameter that can be used **without installing GeoViews
|
|
63
|
+
"A [tiled web map](https://en.wikipedia.org/wiki/Tiled_web_map), or tile map, is an interactive map displayed on a web browser that is divided into small, pre-rendered image tiles, allowing for efficient loading and seamless navigation across various zoom levels and geographic areas. hvPlot allows to add a tile map as a basemap to a plot with the `tiles` parameter. Importantly, `tiles` is a parameter that can be used **without installing GeoViews**.\n",
|
|
64
64
|
"\n",
|
|
65
65
|
"We'll display this dataframe of all US airports (including military bases overseas), the points are expressed in latitude/longitude coordinates:"
|
|
66
66
|
]
|
|
@@ -78,7 +78,11 @@
|
|
|
78
78
|
"cell_type": "markdown",
|
|
79
79
|
"metadata": {},
|
|
80
80
|
"source": [
|
|
81
|
-
"We'll first start by displaying the airports **without GeoViews
|
|
81
|
+
"We'll first start by displaying the airports **without GeoViews** with tiles by setting `tiles=True`. \n",
|
|
82
|
+
"\n",
|
|
83
|
+
"Under the hood, hvPlot projects lat/lon to easting/northing (EPSG:4326 to EPSG:3857) coordinates without additional package dependencies if it detects that the values falls within expected lat/lon ranges.\n",
|
|
84
|
+
"\n",
|
|
85
|
+
"Note, **this feature is only available after `hvplot>0.10.0`**; older versions, `hvplot<=0.10.0`, require manual projection (see below)."
|
|
82
86
|
]
|
|
83
87
|
},
|
|
84
88
|
{
|
|
@@ -87,17 +91,14 @@
|
|
|
87
91
|
"metadata": {},
|
|
88
92
|
"outputs": [],
|
|
89
93
|
"source": [
|
|
90
|
-
"
|
|
91
|
-
"\n",
|
|
92
|
-
"airports['x'], airports['y'] = lon_lat_to_easting_northing(airports.Longitude, airports.Latitude)\n",
|
|
93
|
-
"airports[['Latitude', 'Longitude', 'x', 'y']].head(3)"
|
|
94
|
+
"airports.hvplot.points('Longitude', 'Latitude', tiles=True, color='red', alpha=0.2)"
|
|
94
95
|
]
|
|
95
96
|
},
|
|
96
97
|
{
|
|
97
98
|
"cell_type": "markdown",
|
|
98
99
|
"metadata": {},
|
|
99
100
|
"source": [
|
|
100
|
-
"
|
|
101
|
+
"If you do not want it to be auto-projected under the hood for any reason, set `projection=False`, **but note it will not be properly placed on the tiles** without manual intervention. In doing so, the data will be plotted around the [null island location](https://en.wikipedia.org/wiki/Null_Island), roughly 600km off the coast of West Africa. `padding` was added to demonstrate this."
|
|
101
102
|
]
|
|
102
103
|
},
|
|
103
104
|
{
|
|
@@ -106,14 +107,14 @@
|
|
|
106
107
|
"metadata": {},
|
|
107
108
|
"outputs": [],
|
|
108
109
|
"source": [
|
|
109
|
-
"airports.hvplot.points('
|
|
110
|
+
"airports.hvplot.points('Longitude', 'Latitude', tiles=True, projection=False, color='red', alpha=0.2, padding=10000)"
|
|
110
111
|
]
|
|
111
112
|
},
|
|
112
113
|
{
|
|
113
114
|
"cell_type": "markdown",
|
|
114
115
|
"metadata": {},
|
|
115
116
|
"source": [
|
|
116
|
-
"
|
|
117
|
+
"To manually project use the `lon_lat_to_easting_northing` function provided by HoloViews, that doesn't require installing any of the usual geo dependencies like `pyproj` or `cartopy`."
|
|
117
118
|
]
|
|
118
119
|
},
|
|
119
120
|
{
|
|
@@ -122,10 +123,11 @@
|
|
|
122
123
|
"metadata": {},
|
|
123
124
|
"outputs": [],
|
|
124
125
|
"source": [
|
|
125
|
-
"
|
|
126
|
-
"
|
|
127
|
-
"
|
|
128
|
-
")"
|
|
126
|
+
"from holoviews.util.transform import lon_lat_to_easting_northing\n",
|
|
127
|
+
"\n",
|
|
128
|
+
"airports['x'], airports['y'] = lon_lat_to_easting_northing(airports.Longitude, airports.Latitude)\n",
|
|
129
|
+
"airports[['Latitude', 'Longitude', 'x', 'y']].head(3)\n",
|
|
130
|
+
"airports.hvplot.points('x', 'y', tiles=True, color='red', alpha=0.2)"
|
|
129
131
|
]
|
|
130
132
|
},
|
|
131
133
|
{
|
|
@@ -415,7 +417,7 @@
|
|
|
415
417
|
"- `global_extent` (default=False): Whether to expand the plot extent to span the whole globe\n",
|
|
416
418
|
"- `project` (default=False): Whether to project the data before plotting (adds initial overhead but avoids projecting data when plot is dynamically updated)\n",
|
|
417
419
|
"- `projection` (default=None): Coordinate reference system of the plot (output projection) specified as a string or integer EPSG code, a CRS or Proj pyproj object, a Cartopy CRS object or class name, a WKT string, or a proj.4 string. Defaults to PlateCarree.\n",
|
|
418
|
-
"- `tiles` (default=False): Whether to overlay the plot on a tile source.
|
|
420
|
+
"- `tiles` (default=False): Whether to overlay the plot on a tile source. If coordinate values fall within lat/lon bounds, auto-projects to EPSG:3857 unless `projection=False`. Accepts the following values:\n",
|
|
419
421
|
" - `True`: OpenStreetMap layer\n",
|
|
420
422
|
" - `xyzservices.TileProvider` instance (requires [`xyzservices`](https://xyzservices.readthedocs.io/) to be installed)\n",
|
|
421
423
|
" - a map string name based on one of the default layers made available by [HoloViews](https://holoviews.org/reference/elements/bokeh/Tiles.html) ('CartoDark', 'CartoLight', 'EsriImagery', 'EsriNatGeo', 'EsriUSATopo', 'EsriTerrain', 'EsriStreet', 'EsriReference', 'OSM', 'OpenTopoMap') or [GeoViews](https://geoviews.org/user_guide/Working_with_Bokeh.html) ('CartoDark', 'CartoEco', 'CartoLight', 'CartoMidnight', 'EsriImagery', 'EsriNatGeo', 'EsriUSATopo', 'EsriTerrain', 'EsriReference', 'EsriOceanBase', 'EsriOceanReference', 'EsriWorldPhysical', 'EsriWorldShadedRelief', 'EsriWorldTopo', 'EsriWorldDarkGrayBase', 'EsriWorldDarkGrayReference', 'EsriWorldLightGrayBase', 'EsriWorldLightGrayReference', 'EsriWorldHillshadeDark', 'EsriWorldHillshade', 'EsriAntarcticImagery', 'EsriArcticImagery', 'EsriArcticOceanBase', 'EsriArcticOceanReference', 'EsriWorldBoundariesAndPlaces', 'EsriWorldBoundariesAndPlacesAlternate', 'EsriWorldTransportation', 'EsriDelormeWorldBaseMap', 'EsriWorldNavigationCharts', 'EsriWorldStreetMap', 'OSM', 'OpenTopoMap'). Note that Stamen tile sources require a Stadia account when not running locally; see [stadiamaps.com](https://stadiamaps.com/).\n",
|
|
@@ -635,6 +635,45 @@
|
|
|
635
635
|
" crime.hvplot.table(['Year', 'Population', 'Violent Crime rate'], width=420))"
|
|
636
636
|
]
|
|
637
637
|
},
|
|
638
|
+
{
|
|
639
|
+
"cell_type": "markdown",
|
|
640
|
+
"metadata": {},
|
|
641
|
+
"source": [
|
|
642
|
+
"We can further enhance the plot by using a `step`s chart instead of a `bar` chart to avoid visual clutter and better represent the continuous nature of time series data. Additionally, we can display a table summarizing decade-averaged statistics to provide a quick overview of the data. The `sublabel` format and size can be customized, and if not needed, can be removed by setting `sublabel_format=\"\"` in [opts](https://holoviews.org/user_guide/Applying_Customizations.html)."
|
|
643
|
+
]
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
"cell_type": "code",
|
|
647
|
+
"execution_count": null,
|
|
648
|
+
"metadata": {},
|
|
649
|
+
"outputs": [],
|
|
650
|
+
"source": [
|
|
651
|
+
"tabledata = (\n",
|
|
652
|
+
" crime.assign(\n",
|
|
653
|
+
" **{\n",
|
|
654
|
+
" \"Decade\": (crime.Year // 10) * 10, # Calculate decade for each year\n",
|
|
655
|
+
" \"Population [mi]\": crime.Population / 1e6, # Population in millions\n",
|
|
656
|
+
" }\n",
|
|
657
|
+
" )\n",
|
|
658
|
+
" .groupby(\"Decade\") # Group data by decade\n",
|
|
659
|
+
" .mean() # Calculate mean values for each decade group\n",
|
|
660
|
+
" [[\"Population [mi]\", \"Violent Crime rate\"]] # Select desired columns\n",
|
|
661
|
+
" .astype(\"int\") # Convert selected columns to integers\n",
|
|
662
|
+
")"
|
|
663
|
+
]
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
"cell_type": "code",
|
|
667
|
+
"execution_count": null,
|
|
668
|
+
"metadata": {},
|
|
669
|
+
"outputs": [],
|
|
670
|
+
"source": [
|
|
671
|
+
"(\n",
|
|
672
|
+
" crime.hvplot.step(x='Year', y='Violent Crime rate', rot=90, width=550)+\n",
|
|
673
|
+
" tabledata.hvplot.table(['Decade', 'Population [mi]', 'Violent Crime rate'], width=15, height=10)\n",
|
|
674
|
+
").opts(sublabel_format=\"{alpha})\", sublabel_size=14)"
|
|
675
|
+
]
|
|
676
|
+
},
|
|
638
677
|
{
|
|
639
678
|
"cell_type": "markdown",
|
|
640
679
|
"metadata": {},
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"metadata": {},
|
|
21
21
|
"outputs": [],
|
|
22
22
|
"source": [
|
|
23
|
+
"import numpy as np\n",
|
|
23
24
|
"import hvplot.pandas # noqa\n",
|
|
24
25
|
"from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature as sst\n",
|
|
25
26
|
"\n",
|
|
@@ -84,6 +85,32 @@
|
|
|
84
85
|
"sst.hvplot(autorange=\"y\")"
|
|
85
86
|
]
|
|
86
87
|
},
|
|
88
|
+
{
|
|
89
|
+
"cell_type": "markdown",
|
|
90
|
+
"metadata": {},
|
|
91
|
+
"source": [
|
|
92
|
+
"### Subcoordinate y-axis\n",
|
|
93
|
+
"\n",
|
|
94
|
+
"hvPlot enables you to create overlays where each element has its own distinct y-axis subcoordinate system, which is particularly useful to analyse multiple timeseries. To activate this feature that automatically distributes overlay elements along the y-axis, set the `subcoordinate_y` keyword to `True`. `subcoordinate_y` also accepts a dictionary of related options, for example set `subcoordinate_y={'subcoordinate_scale': 2}` to increase the scale of each sub-plot, resulting in each curve's vertical range overlapping 50% with its adjacent elements. Additionally, the y-axis wheel-zoom will apply to each curve's respective sub-coordinate y-axis, rather than the global coordinate frame. More information about this feature can be found in [HoloViews' documentation](https://holoviews.org/user_guide/Customizing_Plots.html#subcoordinate-y-axis)."
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"cell_type": "markdown",
|
|
99
|
+
"metadata": {},
|
|
100
|
+
"source": [
|
|
101
|
+
"For demonstration purposes, we'll temporarily add a new column of 'sensors' that splits up the temperature data into several series."
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"cell_type": "code",
|
|
106
|
+
"execution_count": null,
|
|
107
|
+
"metadata": {},
|
|
108
|
+
"outputs": [],
|
|
109
|
+
"source": [
|
|
110
|
+
"sensor = np.random.choice(['s1', 's2', 's3', 's4'], size=len(sst))\n",
|
|
111
|
+
"sst.assign(sensor=sensor).hvplot(by='sensor', subcoordinate_y=True)"
|
|
112
|
+
]
|
|
113
|
+
},
|
|
87
114
|
{
|
|
88
115
|
"cell_type": "markdown",
|
|
89
116
|
"metadata": {},
|
|
@@ -15,6 +15,7 @@ channels:
|
|
|
15
15
|
dependencies:
|
|
16
16
|
- python=3.10
|
|
17
17
|
- bokeh>=3.1
|
|
18
|
+
- bokeh_sampledata
|
|
18
19
|
- cartopy
|
|
19
20
|
- colorcet>=2
|
|
20
21
|
- dask
|
|
@@ -50,6 +51,7 @@ dependencies:
|
|
|
50
51
|
- pooch
|
|
51
52
|
- pooch>=1.6.0
|
|
52
53
|
- pre-commit
|
|
54
|
+
- psutil
|
|
53
55
|
- pygraphviz
|
|
54
56
|
- pyproj
|
|
55
57
|
- pytest
|
|
@@ -65,6 +67,7 @@ dependencies:
|
|
|
65
67
|
- scipy>=1.5.3
|
|
66
68
|
- selenium>=3.141.0
|
|
67
69
|
- setuptools_scm>=6
|
|
70
|
+
- spatialpandas
|
|
68
71
|
- spatialpandas>=0.4.3
|
|
69
72
|
- sqlglot
|
|
70
73
|
- streamz>=0.3.0
|
|
@@ -15,6 +15,7 @@ channels:
|
|
|
15
15
|
dependencies:
|
|
16
16
|
- python=3.11
|
|
17
17
|
- bokeh>=3.1
|
|
18
|
+
- bokeh_sampledata
|
|
18
19
|
- cartopy
|
|
19
20
|
- colorcet>=2
|
|
20
21
|
- dask
|
|
@@ -50,6 +51,7 @@ dependencies:
|
|
|
50
51
|
- pooch
|
|
51
52
|
- pooch>=1.6.0
|
|
52
53
|
- pre-commit
|
|
54
|
+
- psutil
|
|
53
55
|
- pygraphviz
|
|
54
56
|
- pyproj
|
|
55
57
|
- pytest
|
|
@@ -65,6 +67,7 @@ dependencies:
|
|
|
65
67
|
- scipy>=1.5.3
|
|
66
68
|
- selenium>=3.141.0
|
|
67
69
|
- setuptools_scm>=6
|
|
70
|
+
- spatialpandas
|
|
68
71
|
- spatialpandas>=0.4.3
|
|
69
72
|
- sqlglot
|
|
70
73
|
- streamz>=0.3.0
|
|
@@ -15,6 +15,7 @@ channels:
|
|
|
15
15
|
dependencies:
|
|
16
16
|
- python=3.12
|
|
17
17
|
- bokeh>=3.1
|
|
18
|
+
- bokeh_sampledata
|
|
18
19
|
- cartopy
|
|
19
20
|
- colorcet>=2
|
|
20
21
|
- dask
|
|
@@ -50,6 +51,7 @@ dependencies:
|
|
|
50
51
|
- pooch
|
|
51
52
|
- pooch>=1.6.0
|
|
52
53
|
- pre-commit
|
|
54
|
+
- psutil
|
|
53
55
|
- pygraphviz
|
|
54
56
|
- pyproj
|
|
55
57
|
- pytest
|
|
@@ -65,6 +67,7 @@ dependencies:
|
|
|
65
67
|
- scipy>=1.5.3
|
|
66
68
|
- selenium>=3.141.0
|
|
67
69
|
- setuptools_scm>=6
|
|
70
|
+
- spatialpandas
|
|
68
71
|
- spatialpandas>=0.4.3
|
|
69
72
|
- sqlglot
|
|
70
73
|
- streamz>=0.3.0
|