Python Panel Library
last modified January 23, 2025
The Panel library is an open-source Python library designed to streamline the development of robust tools, dashboards, and complex applications entirely within Python. It is part of the HoloViz ecosystem, which provides a suite of data exploration tools.
Installing Panel
You can install the Panel library using pip:
$ pip install panel
show vs servable
The show and servable methods are two key ways to
display Panel objects.
The show Method
- Purpose: Immediately displays the Panel object in a web browser.
- Context: Ideal for local development, quick previews, and Jupyter notebooks.
- Usage: Simply call
showon your Panel object to open it in the default web browser.
The servable Method
- Purpose: Prepares the Panel object to be served by a Panel server.
- Context: Used for deploying applications in a server environment for production use.
- Usage: Call
servableon your Panel object, then use thepanel servecommand to serve the application.
In essence, use show for instant, local previews and
servable for deploying applications to be accessed over the web.
Use Cases
- Dashboards: Create interactive and dynamic dashboards to visualize and explore data.
- Web Applications: Develop web applications with user interfaces that interact with Python code.
- Exploratory Data Analysis: Build tools to quickly explore and analyze data sets interactively.
- Interactive Reports: Generate interactive reports that allow users to manipulate data and visualize results.
- Real-Time Monitoring: Set up real-time monitoring dashboards to track live data feeds and visualize changes.
- Custom GUIs: Create custom graphical user interfaces for scientific computing, financial analysis, and other applications.
Column Example
The following example demonstrates how to create a column layout with multiple components using the Panel library.
import panel as pn
pn.extension(design="material")
component = pn.panel("an old falcon")
layout = pn.Column(
component, pn.widgets.IntSlider(value=2, start=0, end=10, name="Value"),
pn.pane.HTML("<h1>Title</h1>")
)
print(layout)
layout.show()
In this example, we import the Panel library and initialize it with the Material
design theme using pn.extension(design="material"). We then create
a column layout with three components: a text panel, an integer slider, and an
HTML pane. The pn.Column function is used to arrange these
components vertically.
Rows
In the next example, we show how to organize items in rows. We also apply some custom CSS in panels
import panel as pn
# Apply the custom CSS
custom_css = """
* {
background-color: #2e2e2e;
color: white;
}
"""
# Apply the custom CSS
pn.extension(raw_css=[custom_css])
component1 = pn.panel("Panel 1")
component2 = pn.panel("Panel 2")
base = pn.FlexBox(flex_direction='column')
row1 = pn.Row(
component1, component2,
pn.pane.HTML("<p>paragraph</p>"),
pn.pane.Str(
'This is a raw string that will not be formatted in any way.',
)
)
row2 = pn.Row(
pn.pane.Markdown("""\
# Wind Turbine
A wind turbine is a device that converts the kinetic energy of wind into \
[electrical energy](https://en.wikipedia.org/wiki/Electrical_energy).
Read more [here](https://en.wikipedia.org/wiki/Wind_turbine).
""")
)
base.append(row1)
base.append(row2)
base.show()
Custom CSS is defined to set a dark background color and white text for all
elements. The pn.extension(raw_css=[custom_css]) method applies
this CSS to the entire application. Then, several Panel components are created,
including component1 and component2 as basic panels, an HTML pane with a
paragraph, and a raw string pane. These components are arranged in rows using
pn.Row to create structured layouts.
Row 1 contains component1, component2, an HTML paragraph, and a raw string,
while Row 2 contains a Markdown pane with information about wind turbines. These
rows are added to a pn.FlexBox with a column layout, which serves
as the main container for the application. Finally base.show
launches the application in a web browser. The result is a web application with
a dark theme and organized content that demonstrates the flexibility and styling
capabilities of Panel.
DataFrame Example
The following example demonstrates how to display a Pandas DataFrame in a Panel application.
import pandas as pd
import panel as pn
pn.extension()
data = {'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8], 'C': [9, 10, 11, 12]}
df = pd.DataFrame(data)
table = pn.widgets.DataFrame(df, name='DataFrame Viewer')
table.width = 400
table.height = 350
app = pn.Column("# DataFrame Viewer", table)
app.show()
In this example, we import the Panel and Pandas libraries and initialize Panel
with pn.extension. We then create a DataFrame with some sample
data and use the pn.widgets.DataFrame function to create a table
widget. We set the width and height of the table and create a column layout with
a title and the table. Finally, we display the layout using the
show method.
FloatSlider
This example demonstrates how to create a simple Panel app with a slider and a text display.
import panel as pn
slider = pn.widgets.FloatSlider(name='Slider', start=0, end=10)
text = pn.pane.Str('Slider value: 0')
def update_text(event):
text.object = f'Slider value: {event.new}'
slider.param.watch(update_text, 'value')
app = pn.Column(slider, text)
app.show()
The example creates a simple interactive web application with a float slider and
a text display. The FloatSlider widget allows users to select a
value between 0 and 10. Initially, the text pane displays
"Slider value: 0". The update_text function updates the text pane to show
the current slider value whenever the slider's value changes.
The watch method attaches the update_text
function to the slider's 'value' parameter, ensuring the text updates
dynamically. Finally, pn.Column organizes the slider and text into
a vertical layout.
The app.show launches the Panel application in a web browser
immediately, displaying the float slider and the text pane.
Interactive Plot
This example shows how to create an interactive plot using Panel and Matplotlib.
import panel as pn
import matplotlib.pyplot as plt
import numpy as np
pn.extension()
def plot_sine(frequency):
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(frequency * x)
plt.figure()
plt.plot(x, y)
plt.title(f'Sine Wave with Frequency {frequency}')
return plt.gcf()
frequency_slider = pn.widgets.FloatSlider(name='Frequency', start=1, end=10, value=1)
interactive_plot = pn.bind(plot_sine, frequency=frequency_slider)
app = pn.Column(frequency_slider, interactive_plot)
app.servable()
This example demonstrates how to create an interactive web application using the
Panel library to visualize sine waves with varying frequencies. The
plot_sine function generates a sine wave plot based on the provided
frequency using Matplotlib and NumPy.
A FloatSlider widget named frequency_slider allows
users to adjust the sine wave frequency between 1 and 10. The
pn.bind function binds the slider's value to the plot_sine
function, ensuring that the plot updates dynamically as the slider is adjusted.
The pn.Column
function arranges the slider and the interactive plot vertically
Interactive Data Fetching and Display
The next example illustrates how to create an interactive web application using the Panel library to fetch and display data from a provided JSON URL.
import panel as pn
import requests
import pandas as pd
pn.extension()
def load_data(event):
url = text_input.value
response = requests.get(url)
data = response.json()
df = pd.DataFrame(data)
table.object = df
text_input = pn.widgets.TextInput(name='JSON URL',
value='https://jsonplaceholder.typicode.com/users')
button = pn.widgets.Button(name='Load Data', button_type='primary')
button.on_click(load_data)
table = pn.pane.DataFrame(pd.DataFrame(), sizing_mode='stretch_width')
app = pn.Column(pn.Row(text_input, button), table)
app.show()
The load_data function retrieves data from the URL entered in the
TextInput widget, converts it to a pandas DataFrame, and updates the table pane.
The application includes a TextInput widget for users to input the
JSON URL, a Button widget to trigger data loading, and a
DataFrame pane to display the fetched data.
The layout arranges these components in a column format, and
app.show launches the application in a web browser, providing a
user-friendly interface for interacting with remote data.
Source
In this article, we have explored the Python Panel library and demonstrated its capabilities through practical examples.
Author
List all Python tutorials.