ZetCode

Python Panel 库

最后修改于 2025 年 1 月 23 日

Panel 库是一个开源的 Python 库,旨在简化完全在 Python 中构建强大工具、仪表板和复杂应用程序的开发过程。它是 HoloViz 生态系统的一部分,该生态系统提供了一套数据探索工具。

安装 Panel

您可以使用 pip 安装 Panel 库

$ pip install panel

show 和 servable 的区别

showservable 方法是显示 Panel 对象的两种关键方式。

show 方法

servable 方法

本质上,使用 show 进行即时本地预览,使用 servable 将应用程序部署到 Web 上进行访问。

用例

列布局示例

以下示例演示了如何使用 Panel 库创建具有多个组件的列布局。

column.py
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()

在此示例中,我们导入 Panel 库并使用 Material 设计主题通过 pn.extension(design="material") 初始化它。然后,我们创建了一个包含三个组件的列布局:一个文本面板、一个整数滑块和一个 HTML 面板。pn.Column 函数用于垂直排列这些组件。

行布局

在下一个示例中,我们展示了如何将项目组织成行。我们还为面板应用了一些自定义 CSS。

rows.py
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()

自定义 CSS 被定义为为主所有元素设置深色背景和白色文本。pn.extension(raw_css=[custom_css]) 方法将此 CSS 应用于整个应用程序。然后,创建了几个 Panel 组件,包括作为基本面板的 component1 和 component2、一个带有段落的 HTML 面板以及一个原始字符串面板。这些组件使用 pn.Row 排列成行,以创建结构化的布局。

第 1 行包含 component1、component2、一个 HTML 段落和一个原始字符串,而第 2 行包含一个关于风力涡轮机的 Markdown 面板。这些行被添加到具有列布局的 pn.FlexBox 中,它作为应用程序的主容器。最后,base.show 在 Web 浏览器中启动应用程序。结果是一个具有深色主题和组织内容的 Web 应用程序,演示了 Panel 的灵活性和样式设置功能。

DataFrame 示例

以下示例演示了如何在 Panel 应用程序中显示 Pandas DataFrame。

dataframe.py
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()

在此示例中,我们导入 Panel 和 Pandas 库,并使用 pn.extension 初始化 Panel。然后,我们创建一个包含一些示例数据的 DataFrame,并使用 pn.widgets.DataFrame 函数创建一个表格小部件。我们设置了表格的宽度和高度,并创建了一个带有标题和表格的列布局。最后,我们使用 show 方法显示布局。

FloatSlider

此示例演示了如何创建一个带有滑块和文本显示的简单 Panel 应用程序。

float_slider.py
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()

该示例创建了一个简单的交互式 Web 应用程序,其中包含一个浮点滑块和一个文本显示。FloatSlider 小部件允许用户在 0 到 10 之间选择一个值。最初,text 面板显示“Slider value: 0”。当滑块的值发生变化时,update_text 函数会更新文本面板以显示当前的滑块值。

watch 方法将 update_text 函数附加到滑块的“value”参数,确保文本动态更新。最后,pn.Column 将滑块和文本组织成垂直布局。

app.show 会立即在 Web 浏览器中启动 Panel 应用程序,显示浮点滑块和文本面板。

交互式绘图

此示例展示了如何使用 Panel 和 Matplotlib 创建交互式绘图。

interactive_plot.py
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()

此示例演示了如何使用 Panel 库创建交互式 Web 应用程序,以可视化具有不同频率的正弦波。plot_sine 函数使用 Matplotlib 和 NumPy 根据提供的频率生成正弦波图。

一个名为 frequency_sliderFloatSlider 小部件允许用户在 1 到 10 之间调整正弦波频率。pn.bind 函数将滑块的值绑定到 plot_sine 函数,确保在调整滑块时图会自动更新。pn.Column 函数将滑块和交互式图垂直排列。

交互式数据获取和显示

下一个示例说明了如何使用 Panel 库创建交互式 Web 应用程序,以从提供的 JSON URL 获取和显示数据。

data_fetch.py
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()

load_data 函数从 TextInput 小部件中输入的 URL 中检索数据,将其转换为 pandas DataFrame,并更新表格面板。该应用程序包含一个用于用户输入 JSON URL 的 TextInput 小部件,一个用于触发数据加载的 Button 小部件,以及一个用于显示获取数据的 DataFrame 面板。

该布局以列格式排列这些组件,app.show 在 Web 浏览器中启动应用程序,提供了一个用户友好的界面来与远程数据进行交互。

来源

Python Panel 文档

在本文中,我们探讨了 Python Panel 库,并通过实际示例展示了其功能。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程