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.
Files changed (201) hide show
  1. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/docs.yaml +0 -4
  2. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/test.yaml +4 -2
  3. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/PKG-INFO +6 -1
  4. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/conftest.py +21 -1
  5. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/installation.md +1 -1
  6. hvplot-0.11.0a2/doc/reference/xarray/vectorfield.ipynb +230 -0
  7. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Customization.ipynb +15 -1
  8. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Geographic_Data.ipynb +16 -14
  9. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_with_Matplotlib.ipynb +39 -0
  10. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Timeseries_Data.ipynb +27 -0
  11. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.10-tests.yaml +3 -0
  12. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.11-docs.yaml +1 -0
  13. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.11-tests.yaml +3 -0
  14. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.12-tests.yaml +3 -0
  15. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/envs/py3.9-tests.yaml +2 -0
  16. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/__init__.py +28 -2
  17. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/_version.py +1 -1
  18. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/converter.py +72 -7
  19. hvplot-0.11.0a2/hvplot/cudf.py +30 -0
  20. hvplot-0.11.0a2/hvplot/dask.py +46 -0
  21. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/fugue.py +8 -4
  22. hvplot-0.11.0a2/hvplot/ibis.py +25 -0
  23. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/intake.py +9 -5
  24. hvplot-0.11.0a2/hvplot/pandas.py +33 -0
  25. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/polars.py +6 -4
  26. hvplot-0.11.0a2/hvplot/streamz.py +24 -0
  27. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testcore.py +0 -13
  28. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testcharts.py +16 -0
  29. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgeo.py +9 -0
  30. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgeowithoutgv.py +8 -0
  31. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testgridplots.py +7 -0
  32. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoptions.py +15 -0
  33. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testplotting.py +0 -12
  34. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testutil.py +25 -3
  35. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/util.py +1 -1
  36. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/xarray.py +7 -5
  37. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/PKG-INFO +6 -1
  38. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/SOURCES.txt +1 -1
  39. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/requires.txt +9 -0
  40. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/pyproject.toml +5 -0
  41. hvplot-0.11.0a1/doc/reference/xarray/vectorfield.ipynb +0 -126
  42. hvplot-0.11.0a1/hvplot/cudf.py +0 -26
  43. hvplot-0.11.0a1/hvplot/dask.py +0 -42
  44. hvplot-0.11.0a1/hvplot/ibis.py +0 -21
  45. hvplot-0.11.0a1/hvplot/pandas.py +0 -30
  46. hvplot-0.11.0a1/hvplot/streamz.py +0 -21
  47. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.git-blame-ignore-revs +0 -0
  48. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.git_archival.txt +0 -0
  49. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.gitattributes +0 -0
  50. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/CONTRIBUTING.md +0 -0
  51. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/FUNDING.yml +0 -0
  52. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.github/workflows/build.yaml +0 -0
  53. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.gitignore +0 -0
  54. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/.pre-commit-config.yaml +0 -0
  55. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/CHANGELOG.md +0 -0
  56. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/CODE_OF_CONDUCT.md +0 -0
  57. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/LICENSE +0 -0
  58. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/README.md +0 -0
  59. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/binder/environment.yml +0 -0
  60. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/binder/postBuild +0 -0
  61. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/conda.recipe/meta.yaml +0 -0
  62. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/custom.css +0 -0
  63. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/favicon.ico +0 -0
  64. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/bokeh.gif +0 -0
  65. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/dask.gif +0 -0
  66. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/explorer.gif +0 -0
  67. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/geo.gif +0 -0
  68. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/geopandas.gif +0 -0
  69. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/intake.gif +0 -0
  70. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_hvplot.gif +0 -0
  71. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_pandas.gif +0 -0
  72. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/interactive_xarray.gif +0 -0
  73. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/large_data.gif +0 -0
  74. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/layout.gif +0 -0
  75. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/matplotlib.png +0 -0
  76. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/networkx.gif +0 -0
  77. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/overlay.png +0 -0
  78. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/pandas.gif +0 -0
  79. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/plotly.gif +0 -0
  80. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/widgets.gif +0 -0
  81. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/home/xarray.gif +0 -0
  82. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/images/heat_and_trees.png +0 -0
  83. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/images/portfolio.png +0 -0
  84. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo.png +0 -0
  85. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo_horizontal.svg +0 -0
  86. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/_static/logo_stacked.svg +0 -0
  87. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/about.md +0 -0
  88. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/console.png +0 -0
  89. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/console_server.gif +0 -0
  90. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/diagram.png +0 -0
  91. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/diagram.svg +0 -0
  92. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/hvplot-wm.png +0 -0
  93. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/assets/streamz_demo.gif +0 -0
  94. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/conf.py +0 -0
  95. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/developer_guide/index.md +0 -0
  96. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/explorer.ipynb +0 -0
  97. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/hvplot.ipynb +0 -0
  98. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/index.md +0 -0
  99. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/getting_started/interactive.ipynb +0 -0
  100. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/CONTRIBUTING.md +0 -0
  101. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/GOVERNANCE.md +0 -0
  102. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/LICENSE.md +0 -0
  103. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/governance/project-docs/MEMBERS.md +0 -0
  104. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/index.md +0 -0
  105. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/geopandas/points.ipynb +0 -0
  106. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/geopandas/polygons.ipynb +0 -0
  107. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/andrewscurves.ipynb +0 -0
  108. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/area.ipynb +0 -0
  109. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/bar.ipynb +0 -0
  110. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/barh.ipynb +0 -0
  111. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/bivariate.ipynb +0 -0
  112. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/box.ipynb +0 -0
  113. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/errorbars.ipynb +0 -0
  114. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/heatmap.ipynb +0 -0
  115. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/hexbin.ipynb +0 -0
  116. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/hist.ipynb +0 -0
  117. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/kde.ipynb +0 -0
  118. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/labels.ipynb +0 -0
  119. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/lagplot.ipynb +0 -0
  120. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/line.ipynb +0 -0
  121. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/ohlc.ipynb +0 -0
  122. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/parallelcoordinates.ipynb +0 -0
  123. {hvplot-0.11.0a1/doc/reference/pandas → hvplot-0.11.0a2/doc/reference/tabular}/paths.ipynb +0 -0
  124. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/scatter.ipynb +0 -0
  125. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/scattermatrix.ipynb +0 -0
  126. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/step.ipynb +0 -0
  127. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/table.ipynb +0 -0
  128. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/tabular/violin.ipynb +0 -0
  129. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/bar.ipynb +0 -0
  130. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/contour.ipynb +0 -0
  131. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/contourf.ipynb +0 -0
  132. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/hist.ipynb +0 -0
  133. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/image.ipynb +0 -0
  134. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/kde.ipynb +0 -0
  135. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/line.ipynb +0 -0
  136. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/quadmesh.ipynb +0 -0
  137. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/rgb.ipynb +0 -0
  138. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/reference/xarray/violin.ipynb +0 -0
  139. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/releases.md +0 -0
  140. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/roadmap.md +0 -0
  141. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/topics.md +0 -0
  142. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Explorer.ipynb +0 -0
  143. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Gridded_Data.ipynb +0 -0
  144. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Integrations.ipynb +0 -0
  145. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Interactive.ipynb +0 -0
  146. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Introduction.ipynb +0 -0
  147. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Large_Timeseries.ipynb +0 -0
  148. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/NetworkX.ipynb +0 -0
  149. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Pandas_API.ipynb +0 -0
  150. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting.ipynb +0 -0
  151. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_Extensions.ipynb +0 -0
  152. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Plotting_with_Plotly.ipynb +0 -0
  153. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Statistical_Plots.ipynb +0 -0
  154. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Streaming.ipynb +0 -0
  155. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Subplots.ipynb +0 -0
  156. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Viewing.ipynb +0 -0
  157. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/Widgets.ipynb +0 -0
  158. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/images/simple.svg +0 -0
  159. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/doc/user_guide/index.md +0 -0
  160. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/backend_transforms.py +0 -0
  161. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/data/crime.csv +0 -0
  162. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/datasets.yaml +0 -0
  163. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/interactive.py +0 -0
  164. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/networkx.py +0 -0
  165. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/__init__.py +0 -0
  166. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/andrews_curves.py +0 -0
  167. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/core.py +0 -0
  168. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/lag_plot.py +0 -0
  169. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/parallel_coordinates.py +0 -0
  170. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/plotting/scatter_matrix.py +0 -0
  171. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/sample_data.py +0 -0
  172. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/__init__.py +0 -0
  173. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/conftest.py +0 -0
  174. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/data/README.md +0 -0
  175. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/data/RGB-red.byte.tif +0 -0
  176. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/__init__.py +0 -0
  177. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testohlc.py +0 -0
  178. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/plotting/testscattermatrix.py +0 -0
  179. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/test_links.py +0 -0
  180. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testbackend_transforms.py +0 -0
  181. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testfugue.py +0 -0
  182. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testhelp.py +0 -0
  183. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testibis.py +0 -0
  184. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testinteractive.py +0 -0
  185. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testnetworkx.py +0 -0
  186. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoperations.py +0 -0
  187. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testoverrides.py +0 -0
  188. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testpanel.py +0 -0
  189. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testpatch.py +0 -0
  190. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/teststatplots.py +0 -0
  191. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/teststreaming.py +0 -0
  192. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testtransforms.py +0 -0
  193. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/testui.py +0 -0
  194. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/tests/util.py +0 -0
  195. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/ui.py +0 -0
  196. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot/utilities.py +0 -0
  197. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/dependency_links.txt +0 -0
  198. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/entry_points.txt +0 -0
  199. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/hvplot.egg-info/top_level.txt +0 -0
  200. {hvplot-0.11.0a1 → hvplot-0.11.0a2}/scripts/update_conda_envs.py +0 -0
  201. {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 auto --dist loadscope --nbval-lax -p no:python
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 auto --dist loadscope --nbval-lax -p no:python
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.0a1
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 if the data is already projected in Web Mercator**.\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**.\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**. To do so, we must convert the coordinates to Web Mercator, which can be easily achieved using 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`."
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
- "from holoviews.util.transform import lon_lat_to_easting_northing\n",
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
- "We can now easily display the airports on a basemap by setting `tiles` to `True`."
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('x', 'y', tiles=True, color='red', alpha=0.2)"
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
- "A common mistake is to display data referenced in WGS84 on a tile basemap without projecting the data to Web Mercator. 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."
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
- "airports.hvplot.points(\n",
126
- " 'Longitude', 'Latitude', tiles=True, color='red', alpha=0.2,\n",
127
- " xlim=(-1000000, 1000000), ylim=(-1000000, 1000000)\n",
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. Accept the following values:\n",
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>=2021.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