Skip to content

Commit

Permalink
Add tutorial to show interactive data visualization via 'panel' (#2498)
Browse files Browse the repository at this point in the history
Co-authored-by: Wei Ji <[email protected]>
Co-authored-by: Dongdong Tian <[email protected]>
Co-authored-by: Michael Grund <[email protected]>
Co-authored-by: Yvonne Fröhlich <[email protected]>
  • Loading branch information
5 people authored May 1, 2023
1 parent 7d360ef commit bdf5b1e
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 0 deletions.
1 change: 1 addition & 0 deletions .github/workflows/ci_docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ jobs:
make
pip
myst-parser
panel
sphinx
sphinx-copybutton
sphinx-design
Expand Down
1 change: 1 addition & 0 deletions ci/requirements/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies:
- pip
# Dev dependencies (building documentation)
- myst-parser
- panel
- sphinx
- sphinx-copybutton
- sphinx-design
Expand Down
1 change: 1 addition & 0 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dependencies:
- pytest>=6.0
# Dev dependencies (building documentation)
- myst-parser
- panel
- sphinx
- sphinx-copybutton
- sphinx-design
Expand Down
141 changes: 141 additions & 0 deletions examples/tutorials/advanced/working_with_panel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
"""
Interactive data visualization using ``Panel``
==============================================
.. note::
Please run the following code examples in a notebook environment
otherwise the interactive parts of this tutorial will not work. You can
use the button "Download Jupyter notebook" at the bottom of this page
to download this script as a Jupyter notebook.
The library `Panel <https://panel.holoviz.org/index.html>`__ can be used to
create interactive dashboards by connecting user-defined widgets to plots.
``Panel`` can be used as an extension to Jupyter notebook/lab.
This tutorial is split into three parts:
- Make a static map
- Make an interactive map
- Add a grid for Earth relief
"""

# sphinx_gallery_thumbnail_number = 1


# Import the required packages
import numpy as np
import panel as pn
import pygmt

pn.extension()


###############################################################################
# Make a static map
# -----------------
# The `Orthographic projection
# <https://www.pygmt.org/dev/projections/azim/azim_orthographic.html>`__
# can be used to show the Earth as a globe. Land and water masses are
# filled with colors via the ``land`` and ``water`` parameters of
# :meth:`pygmt.Figure.coast`, respectively. Coastlines are added using the
# ``shorelines`` parameter.

# Create a new instance or object of the pygmt.Figure() class
fig = pygmt.Figure()
fig.coast(
# Orthographic projection (G) with projection center at 0° East and
# 15° North and a width of 12 centimeters
projection="G0/15/12c",
region="g", # global
frame="g30", # Add frame and gridlines in steps of 30 degrees on top
land="gray", # Color land masses in "gray"
water="lightblue", # Color water masses in "lightblue"
# Add coastlines with a 0.25 points thick pen in "gray50"
shorelines="1/0.25p,gray50",
)
fig.show()


###############################################################################
# Make an interactive map
# -----------------------
# To generate a rotation of the Earth around the vertical axis, the central
# longitude of the Orthographic projection is varied iteratively in steps of
# 10 degrees. The library ``Panel`` is used to create an interactive dashboard
# with a slider (works only in a notebook environment, e.g. Jupyter notebook).

# Create a slider
slider_lon = pn.widgets.DiscreteSlider(
name="Central longitude", # Give name for quantity shown at the slider
options=list(np.arange(0, 361, 10)), # Range corresponding to longitude
value=0, # Set start value
)


# Define a function for plotting the single slices
@pn.depends(central_lon=slider_lon)
def view(central_lon):
# Create a new instance or object of the pygmt.Figure() class
fig = pygmt.Figure()
fig.coast(
# Vary the central longitude used for the Orthographic projection
projection=f"G{central_lon}/15/12c",
region="g",
frame="g30",
land="gray",
water="lightblue",
shorelines="1/0.25p,gray50",
)
return fig


# Make an interactive dashboard
pn.Column(slider_lon, view)


###############################################################################
# Add a grid for Earth relief
# ---------------------------
# Instead of using colors as fill for the land and water masses a grid can be
# displayed. Here, the Earth relief is shown by color-coding the elevation.

# Download a grid for Earth relief with a resolution of 10 arc-minutes
grd_relief = pygmt.datasets.load_earth_relief(resolution="10m")

# Create a slider
slider_lon = pn.widgets.DiscreteSlider(
name="Central longitude",
options=list(np.arange(0, 361, 10)),
value=0,
)


# Define a function for plotting the single slices
@pn.depends(central_lon=slider_lon)
def view(central_lon):
# Create a new instance or object of the pygmt.Figure() class
fig = pygmt.Figure()
# Set up a colormap for the elevation in meters
pygmt.makecpt(
cmap="oleron",
# minimum, maximum, step
series=[int(grd_relief.data.min()) - 1, int(grd_relief.data.max()) + 1, 100],
)
# Plot the grid for the elevation
fig.grdimage(
projection=f"G{central_lon}/15/12c",
region="g",
grid=grd_relief, # Use grid downloaded above
cmap=True, # Use colormap defined above
frame="g30",
)
# Add a horizontal colorbar for the elevation
# with annotations (a) in steps of 2000 and ticks (f) in steps of 1000
# and labels (+l) at the x-axis "Elevation" and y-axis "m" (meters)
fig.colorbar(frame=["a2000f1000", "x+lElevation", "y+lm"])
return fig


# Make an interactive dashboard
pn.Column(slider_lon, view)

0 comments on commit bdf5b1e

Please sign in to comment.