教程:计算

概览

Quarto提供了多种选项来控制代码和计算输出在渲染文档中的显示方式。在本教程中,我们将从一个包含一些数值输出和图表的简单笔记本开始,介绍如何应用这些选项。

如果你想在自己的环境中一步步跟随操作,请下载下面的笔记本:

然后,创建一个新的工作目录并将笔记本复制到该目录中。

完成这些步骤后,在终端中切换到此目录,安装笔记本依赖项(如有必要),并打开Jupyter Lab开始使用笔记本。你可以使用下表中的命令进行安装和打开Jupyter Lab。

平台 命令
Mac/Linux
Terminal
python3 -m pip install jupyter matplotlib plotly pandas
python3 -m jupyter lab computations.ipynb
Windows
Terminal
py -m pip install jupyter matplotlib plotly pandas
py -m jupyter lab computations.ipynb

我们开始时的笔记本如下所示。请注意,所有单元格尚未执行。

---
title: Quarto Computations
jupyter: python3
---

## NumPy

```{python}
import numpy as np
a = np.arange(15).reshape(3, 5)
a
```

## Matplotlib

```{python}
import matplotlib.pyplot as plt

fig = plt.figure()
x = np.arange(10)
y = 2.5 * np.sin(x / 20 * np.pi)
yerr = np.linspace(0.05, 0.2, 10)

plt.errorbar(x, y + 3, yerr=yerr, label='both limits (default)')
plt.errorbar(x, y + 2, yerr=yerr, uplims=True, label='uplims=True')
plt.errorbar(x, y + 1, yerr=yerr, uplims=True, lolims=True,
             label='uplims=True, lolims=True')

upperlimits = [True, False] * 5
lowerlimits = [False, True] * 5
plt.errorbar(x, y, yerr=yerr, uplims=upperlimits, lolims=lowerlimits,
             label='subsets of uplims and lolims')

plt.legend(loc='lower right')
plt.show(fig)
```

## Plotly

```{python}
import plotly.express as px
import plotly.io as pio
gapminder = px.data.gapminder()
gapminder2007 = gapminder.query("year == 2007")
fig = px.scatter(gapminder2007, 
                 x="gdpPercap", y="lifeExp", color="continent", 
                 size="pop", size_max=60,
                 hover_name="country")
fig.show()
```

Screen shot of computations.ipynb Jupyter notebook with NumPy, Matplotlib, and Plotly code cells shown.

接下来,在Jupyter Lab中创建一个新的终端,用于执行Quarto命令。

Screenshot of menu items in Jupuyter Lab: File > New > Terminal.

最后,在终端中运行quarto preview,并将Jupyter Lab与显示预览的浏览器并排显示。

Terminal
quarto preview computations.ipynb

Side-by-side preview of notebook on the left and live preview in the browser on the right.

继续运行所有单元格,然后保存笔记本。你会看到预览会立即更新。

单元格输出

笔记本中的所有代码都显示在渲染文档中。然而,对于某些文档,你可能希望隐藏所有代码,只显示输出。让我们在文档的execute选项中指定echo: false,以防止代码被打印出来。

---
title: Quarto Computations
execute:
  echo: false
jupyter: python3
---

Screen shot of metadata section of Jupyter notebook with 'echo: false' included under the 'execute:' option.

保存笔记本后,预览将更新以显示无代码的输出。

Output of notebook with echo: false set, shows resulting array in NumPy section, line chart in Numpy section, and interactive bubble chart in Plotly section.

你可能希望有选择地为某些单元格启用代码echo。 要实现这一点,请添加 echo: true 单元格选项。 尝试在 NumPy 单元格中进行此操作。

```{python}
#| echo: true

import numpy as np
a = np.arange(15).reshape(3, 5)
a
```

屏幕截图展示了 Jupyter 笔记本中 NumPy 部分的代码单元格,其中设置了 'echo: true' 作为单元格选项。

保存笔记本,并注意到现在 NumPy 单元格的代码已被包含在内。

屏幕截图展示了渲染后的 Jupyter 笔记本中 NumPy 部分,显示了代码和结果数组。

有许多其他单元格输出选项可用,例如 warning 用于显示/隐藏警告(这对于包加载消息特别有用),include 作为阻止任何输出(代码或结果)被包含在输出中的全能选项,以及 error 用于防止代码执行错误中断文档渲染(并在渲染文档中打印错误)。

有关更多详细信息,请参阅 Jupyter 单元格选项 文档。

代码折叠

与其完全隐藏代码,你可能希望将其折叠,并允许读者自行选择查看。 你可以通过 code-fold 选项来实现这一点。 移除我们先前添加的 echo 选项,并添加 code-fold HTML 格式选项。

---
title: Quarto 计算
execute:
   code-fold: true
jupyter: python3
---

屏幕截图展示了 Jupyter 笔记本元数据部分的代码单元格,其中在 `format:` 选项下包含了 'code-fold: true'。

保存笔记本。 现在,每个单元格的输出上方都有一个“代码”小部件。

屏幕截图展示了渲染后的 Jupyter 笔记本中 NumPy 部分,显示了一个可切换的标签为 '代码' 的部分和结果数组。

你还可以提供全局控制代码折叠的功能。 尝试在 HTML 格式选项中添加 code-tools: true

---
title: Quarto 计算
execute:
   code-fold: true
   code-tools: true
jupyter: python3
---

Jupyter 笔记本元数据部分的屏幕截图,其中在 HTML 格式选项中添加了 'code-tools: true'。

保存笔记本,你会看到文档右上角出现了一个代码菜单,提供了全局控制显示和隐藏代码的功能。

带有 'code-tools: true' 的笔记本输出,其中包括一个代码下拉按钮,位于文档标题旁边,有两个选项:显示所有代码和隐藏所有代码。

```{python}
#| label: fig-limits
#| fig-cap: "误差条限制选择器"

import matplotlib.pyplot as plt

fig = plt.figure()
fig.set_size_inches(12, 7)
```

让我们改进 Matplotlib 输出的外观。 它肯定可以更宽,并且为交叉引用提供标题和标签会很好。

继续修改 Matplotlib 单元格,添加 labelfig-cap 选项,并调用 fig.set_size_inches() 以设置更大的图形尺寸和更宽的纵横比。

```{python}
#| label: fig-limits
#| fig-cap: "误差条限制选择器"

import matplotlib.pyplot as plt

fig = plt.figure()
fig.set_size_inches(12, 7)
```

代码单元格中添加了标签和 fig-cap 选项,以及显式设置图形尺寸的调用。

执行单元格以查看更新后的图表。 然后,保存笔记本以便更新 Quarto 预览。

笔记本中 Matplotlib 部分的输出,其中包含图表下方显示的标题 '图 1:误差条限制选择'。

多个图表

Plotly 单元格可视化了单一年份(2007年)的 GDP 和预期寿命数据。 让我们在旁边绘制另一个年份以进行比较,并添加标题和子标题。 由于这将生成更宽的可视化内容,我们还将使用 column 选项将其布局在整个页面而不是受限于正文文本列。

这个单元格有很多变化。 如果你想在本地尝试,请复制并粘贴以下代码到笔记本中。

#| label: fig-gapminder
#| fig-cap: "预期寿命与国内生产总值"
#| fig-subcap:
#|   - "Gapminder: 1957年"
#|   - "Gapminder: 2007年"
#| layout-ncol: 2
#| column: page

import plotly.express as px
import plotly.io as pio
gapminder = px.data.gapminder()
def gapminder_plot(year):
    gapminderYear = gapminder.query("year == " + 
                                    str(year))
    fig = px.scatter(gapminderYear, 
                     x="gdpPercap", y="lifeExp",
                     size="pop", size_max=60,
                     hover_name="country")
    fig.show()
    
gapminder_plot(1957)
gapminder_plot(2007)

运行修改后的单元格,然后保存笔记本。 预览将更新如下:

输出显示两个并排的图表。第一个图表下方标题为“(a) Gapminder: 1957”,第二个图表的标题为“(b) Gapminder 2007”。两个图表下方有一个总标题“图1:预期寿命和GDP(数据来自gapminder.org的World Bank)”。

让我们讨论一下这里使用的一些新选项。 你之前见过 fig-cap,但现在我们添加了一个 fig-subcap 选项。

#| fig-cap: "预期寿命和GDP"
#| fig-subcap:
#|   - "Gapminder: 1957"
#|   - "Gapminder: 2007"

对于具有多个输出的代码单元格,添加 fig-subcap 选项使我们能够将它们视为子图。

我们还添加了一个选项来控制多个图表的布局方式——在这种情况下,我们指定为两列并排。

#| layout-ncol: 2

如果你在一个面板中有3个、4个或更多图表,有许多选项可用于自定义它们的布局。 有关详细信息,请参阅关于图表的文章。

最后,我们添加了一个选项来控制我们的图表所占据的页面跨度。

#| column: page

这使得我们的图表显示可以超出正常的正文文本列。 关于所有可用的布局选项,请参阅文章布局的文档。

下一步

您现在已经了解了在Quarto文档中自定义可执行代码的行为和输出的基础知识。

接下来,请查看创作教程,以了解更多关于输出格式和技术写作功能,如引用、交叉引用和高级布局。