交互式数据可视化

Jupyter Notebook 支持多种交互输出,包括 ipywidgets 生态系统以及许多交互式可视化库。在正确的配置下,Jupyter Book支持这些功能。本页有一些常见的例子。

首先,我们将下载一些数据并显示其结构:

import plotly.express as px
data = px.data.iris()
data.head()
sepal_length sepal_width petal_length petal_width species species_id
0 5.1 3.5 1.4 0.2 setosa 1
1 4.9 3.0 1.4 0.2 setosa 1
2 4.7 3.2 1.3 0.2 setosa 1
3 4.6 3.1 1.5 0.2 setosa 1
4 5.0 3.6 1.4 0.2 setosa 1

Altair

交互式输出工作的前提是,它们产生的输出具有自包含的 HTML,无需加载任何外部依赖项。请参阅 Altair 安装说明,以便使用 Altair 进行设置。下面是一些输出示例。

import altair as alt
alt.Chart(data=data).mark_point().encode(
    x="sepal_width",
    y="sepal_length",
    color="species",
    size='sepal_length'
)

Plotly

Plotly 是另一个交互式绘图库,它提供了用于可视化的高级 API。请参阅 Plotly JupyterLab 文档,在笔记本中开始使用 Plotly。

下面是一些输出示例。

重要

为了显示这些 plots,可能需要在 _config.yml 中加载 require.js

sphinx:
  config:
    html_js_files:
    - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js
import plotly.io as pio
import plotly.express as px
import plotly.offline as py

df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", size="sepal_length")
fig

Bokeh

Bokeh 为交互式可视化提供了几个选项,是 PyViz 生态系统的一部分。请参阅 带有 Jupyter 的 Bokeh 文档 来开始。

下面是一些输出示例。首先,我们将使用 output_notebook() 初始化 Bokeh。这需要放在一个单独的单元格中,以便给 JavaScript 时间加载。

from bokeh.plotting import figure, show, output_notebook
output_notebook()
Loading BokehJS ...

现在我们来绘制我们的图。

p = figure()
p.circle(data["sepal_width"], data["sepal_length"], fill_color=data["species"], size=data["sepal_length"])
show(p)

ipywidgets

您也可以在文档中运行 Jupyter Widgets 的代码,交互式 HTML 输出将嵌入到您的端中。请参阅 ipywidgets 文档,了解如何在自己的环境中进行设置。

小部件通常需要一个内核

注意,ipywidgets 的行为倾向于不同于其他交互式可视化库。它们既与 Javascript 交互,也与 Python 交互。ipywidgets 中的一些功能可能无法在默认的 Jupyter Book 页面中工作(因为没有运行 Python 内核)。您可以使用用于远程内核的工具来解决这个问题,比如 thebe

下面是一些简单的小部件元素。

import ipywidgets as widgets
widgets.IntSlider(
    value=7,
    min=0,
    max=10,
    step=1,
    description='Test:',
    disabled=False,
    continuous_update=False,
    orientation='horizontal',
    readout=True,
    readout_format='d'
)
tab_contents = ['P0', 'P1', 'P2', 'P3', 'P4']
children = [widgets.Text(description=name) for name in tab_contents]
tab = widgets.Tab()
tab.children = children
for ii in range(len(children)):
    tab.set_title(ii, f"tab_{ii}")
tab

您可以在 jupyter-widgets 文档中找到现有 Jupyter Widgets 的列表