在 Streamlit 仪表板中嵌入 Markdown 文件

原文:towardsdatascience.com/embedding-markdown-files-in-a-streamlit-dashboard-ad232bc3b866

PYTHON 编程

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1a4b4bb1b78485385362e9a19d8c4c9d.png

图片由 Lukas BlazekUnsplash 提供

Streamlit 提供了一个简单而高效的工具,用于在 Python 中创建交互式仪表板:

Streamlit 更快地构建和分享数据应用的方式*

这种交互性使得仪表板如此出色。然而,有时仪表板的一些部分并不是交互式的。为了格式化它们,你可以使用各种函数,其中之一就是 st.markdown()st 来自于 import streamlit as st):

st.markdown – Streamlit 文档

它允许使用典型的 Markdown 语法来格式化文本,因此对我来说,这是最有用的文本格式化 Streamlit 函数。

如果仪表板的大部分内容需要以这种方式格式化,你可以通过将这部分移动到 Markdown 文件中来简化仪表板应用的代码。这样,应用代码将更短更简单。实际上,这样做非常容易,这篇文章展示了如何实现它。

如何

让我们创建一个非常简单的 Streamlit 仪表板。它将包含两个标签页,一个包含 Markdown 文件的内容(例如,tab1.md),另一个只包含一个字符串。这是 tab1.md 文件的内容:

# Streamlit and Markdown

You can embed Markdown files in Streamlit dashboards.

It will render inline `code`, code blocks:

```python

GLOBAL_VARIABLE = 10

class FooException(Exception):

    ...

def foo(x):

    return x**2

if __name__ == "__main__":

    print(foo(2))

```py

text formatting, like *italics* or **bold font**.

Try yourself!

我们需要做的是:

  1. 将 Markdown 文件的内容读取到对象中。我们将定义一个函数来完成这个任务。因此,你可以很容易地将其重复用于所需的所有 Markdown 文件。

  2. 使用 st.tabs() 在 Streamlit 中创建标签页。

  3. 使用 st.markdown() 在第一个标签页中嵌入 Markdown 内容。

这里是一个示例实现:

# app.py

import streamlit as st

def read_markdown_file(file_path):
    with open(file_path, "r") as file:
        return file.read()

tab1_content = read_markdown_file("tab1.md")
tab1, tab2 = st.tabs(["Markdown Tab", "Other Tab"])

with tab1:
    st.markdown(tab1_content)

with tab2:
    st.write("This is tab2!")

让我们运行这个应用:

(venv-streamlit) > streamlit run app.py

你将看到这个:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d5f0a3e430f14cb4b5251172e1d011ac.png

一个 Streamlit 应用正在读取 Markdown 文件并嵌入其内容。作者截图

示例:使用 Iris 数据集进行操作

如上所示,我向你展示了一个工具。现在,让我们使用它来创建一个使用 Streamlit 的交互式演示。

创建仪表板所使用的完整代码可以从以下 GitHub 仓库获取:

GitHub – nyggus/play_with_iris: 在 Streamlit 仪表板中使用 Markdown 文件

代码使用了两个 Markdown 文件,intro.mdplay.md。第一个文件用于显示一个标签页“简介”的全部内容。另一个文件用于展示第三个标签页“玩转数据”的片段。这是我们在上面没有做过的——这个标签页首先显示用户可以在标签页上做什么的解释,并为此使用 Markdown 文件。

首先,让我们分析仪表板。这是它的默认视图:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f304765d05f5d102f26ed8f2dde5652e.png

仪表板默认视图的片段。图片由作者提供

第二个标签页仅显示数据,所以在这里省略。第三个标签页提供了更多内容——请参见下面的截图中的解释。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b02b51bbbeab96dd9c6961dbb77e6c77.png

仪表板第三个标签页的顶部。图片由作者提供

在“玩转 Iris 数据”标题下方和数据编辑器上方的内容都来自 play.md 文件。

标签页的剩余部分显示:

  • 数据编辑器,用户可以在其中更改数据

  • 数据的 SPLOM(散点图矩阵):

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/aa40806416d044601085af7a5b73730e.png

所有特征的 SPLOM 图。图片由作者提供

  • 用户通过下拉菜单选择的特征的箱线图:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/95e2f7b8d7e3398054e1149564ebfc1c.png

按物种选择的特征的箱线图。图片由作者提供

  • “刷新”按钮

  • 自上次点击“刷新”按钮以来的更改日志:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a6403ff61d5714f6be1cca0635d64b90.png

所有这些标签页元素都直接包含在 app.py 文件中,因为它们无法包含在 Markdown 文件中。

现在,让我们看看一些代码——我们使用两个 Markdown 文件的那个:

st.title("The iris dataset")

contents = {}
contents["intro"] = read_markdown_file("intro.md")
contents["play"] = read_markdown_file("play.md")
tab_intro, tab_data, tab_play = st.tabs(
    [
        "Introduction",
        "See the data",
        "Play with the data",
    ]
)

iris = pd.read_csv("iris.csv")

# Initialize session state if not already done
if "iris_edit" not in st.session_state:
    st.session_state["iris_edit"] = iris.copy()
if "log" not in st.session_state:
    st.session_state["log"] = []

def reset_data():
    st.session_state["iris_edit"] = iris.copy()
    st.session_state["log"] = []

with tab_intro:
    st.markdown(contents["intro"])

with tab_data:
    st.write("This is the famous iris dataset:")
    st.dataframe(iris)

with tab_play:
    st.subheader("Play with the Iris data")
    st.markdown(contents["play"])

    # Editable dataframe
    old_data = st.session_state["iris_edit"].copy()
    iris_edit = st.data_editor(
        st.session_state["iris_edit"], num_rows="dynamic"
    )
    st.session_state["iris_edit"] = iris_edit

您可以在 GitHub 仓库 中看到代码的剩余部分。

如您所见,第一个标签页的代码——它展示了一段相当长的文本——非常短,只有两行:

with tab_intro:
    st.markdown(contents["intro"])

第三个标签页使用了 play.md 文件:

with tab_play:
    st.subheader("Play with the Iris data")
    st.markdown(contents["play"])

实际上,我们可以将子标题移动到文件中,但我决定保留在这里以提高可读性——但我认为这不会有多大区别。

想象一下,如果我们直接在代码中使用 st.markdown() 函数包含这两个 Markdown 文件的内容,这将使代码变得非常长,因此可读性会大大降低。此外,由于我们必须将文本作为字符串添加,代码的可读性也会降低。创建 Markdown 文件要容易得多。注意,这不仅使代码更短、更易读,而且也使文本本身更易读——在文件中阅读它比在 st.markdown() 函数中阅读它要容易得多。比较:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dc679611f1ef228fee1ee58e96355fbd.png

例如,有这个:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e7a6d9267bb7201287334606fca65dee.png

结论

这很简单,对吧?你只需要将 Markdown 内容放入一个文件中,读取文件内容到对象中,然后将这个对象传递给st.markdown()函数。

当你需要在你 Streamlit 仪表板中包含较长的 Markdown 内容片段时,这个工具特别方便。对于较短的片段,直接在st.markdown()函数中包含它们更容易。

我已经使用这种方法创建了一些相当复杂的交互式仪表板,这些仪表板从多个 Markdown 文件中读取内容。我还发现 Streamlit 对于创建交互式演示文稿非常有用。Streamlit 非常适合这样的用途。然而,如果你在代码中包含所有的 Markdown 内容,它很快就会变得难以阅读——我讨厌难以阅读的代码。有一天,当我看到自己的 Streamlit 仪表板代码中充满了 Markdown 内容时,我想一定有更好的方法来做这件事。

确实如此。但这种方法还有一个额外的优势,你可能有时会认为它甚至比清晰的代码更重要:不仅这样的代码组织得更好,你还可以重用这些 Markdown 文件。例如,你可以创建一个 Markdown 文件,将所有这些文件的内容合并在一起。通常,Markdown 文件用于编写文档——你可以在仪表板上使用完全相同的文件,而无需复制粘贴其内容。对这样的文件的任何更新都将同时在仪表板和文档中可见。

最后,我想邀请你克隆这个仓库并在你的机器上构建仪表板。它包含的不仅仅是 Markdown 文件的使用演示。但我在那里使用的工具是另一个故事,我将在另一天和另一篇文章中讲述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值