Python Panel 库
最后修改于 2025 年 1 月 23 日
Panel 库是一个开源的 Python 库,旨在简化完全在 Python 中构建强大工具、仪表板和复杂应用程序的开发过程。它是 HoloViz 生态系统的一部分,该生态系统提供了一套数据探索工具。
安装 Panel
您可以使用 pip 安装 Panel 库
$ pip install panel
show 和 servable 的区别
show 和 servable 方法是显示 Panel 对象的两种关键方式。
show 方法
- 用途:立即在 Web 浏览器中显示 Panel 对象。
- 场景:非常适合本地开发、快速预览和 Jupyter notebooks。
- 用法:只需在您的 Panel 对象上调用
show,即可在默认 Web 浏览器中打开它。
servable 方法
- 用途:准备 Panel 对象以供 Panel 服务器提供服务。
- 场景:用于将应用程序部署到服务器环境以供生产使用。
- 用法:在您的 Panel 对象上调用
servable,然后使用panel serve命令来提供应用程序。
本质上,使用 show 进行即时本地预览,使用 servable 将应用程序部署到 Web 上进行访问。
用例
- 仪表板:创建交互式和动态仪表板来可视化和探索数据。
- Web 应用程序:开发具有与 Python 代码交互的用户界面的 Web 应用程序。
- 探索性数据分析:构建工具以交互方式快速探索和分析数据集。
- 交互式报告:生成交互式报告,允许用户操作数据并可视化结果。
- 实时监控:设置实时监控仪表板以跟踪实时数据流并可视化更改。
- 自定义 GUI:为科学计算、金融分析和其他应用程序创建自定义图形用户界面。
列布局示例
以下示例演示了如何使用 Panel 库创建具有多个组件的列布局。
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。
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。
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 应用程序。
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 创建交互式绘图。
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_slider 的 FloatSlider 小部件允许用户在 1 到 10 之间调整正弦波频率。pn.bind 函数将滑块的值绑定到 plot_sine 函数,确保在调整滑块时图会自动更新。pn.Column 函数将滑块和交互式图垂直排列。
交互式数据获取和显示
下一个示例说明了如何使用 Panel 库创建交互式 Web 应用程序,以从提供的 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()
load_data 函数从 TextInput 小部件中输入的 URL 中检索数据,将其转换为 pandas DataFrame,并更新表格面板。该应用程序包含一个用于用户输入 JSON URL 的 TextInput 小部件,一个用于触发数据加载的 Button 小部件,以及一个用于显示获取数据的 DataFrame 面板。
该布局以列格式排列这些组件,app.show 在 Web 浏览器中启动应用程序,提供了一个用户友好的界面来与远程数据进行交互。
来源
在本文中,我们探讨了 Python Panel 库,并通过实际示例展示了其功能。
作者
列出所有 Python 教程。