原文:
towardsdatascience.com/embedding-markdown-files-in-a-streamlit-dashboard-ad232bc3b866
PYTHON 编程
图片由 Lukas Blazek 在 Unsplash 提供
Streamlit 提供了一个简单而高效的工具,用于在 Python 中创建交互式仪表板:
这种交互性使得仪表板如此出色。然而,有时仪表板的一些部分并不是交互式的。为了格式化它们,你可以使用各种函数,其中之一就是 st.markdown() (st 来自于 import streamlit as st):
它允许使用典型的 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!
我们需要做的是:
-
将 Markdown 文件的内容读取到对象中。我们将定义一个函数来完成这个任务。因此,你可以很容易地将其重复用于所需的所有 Markdown 文件。
-
使用
st.tabs()在 Streamlit 中创建标签页。 -
使用
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
你将看到这个:
一个 Streamlit 应用正在读取 Markdown 文件并嵌入其内容。作者截图
示例:使用 Iris 数据集进行操作
如上所示,我向你展示了一个工具。现在,让我们使用它来创建一个使用 Streamlit 的交互式演示。
创建仪表板所使用的完整代码可以从以下 GitHub 仓库获取:
GitHub – nyggus/play_with_iris: 在 Streamlit 仪表板中使用 Markdown 文件
代码使用了两个 Markdown 文件,intro.md 和 play.md。第一个文件用于显示一个标签页“简介”的全部内容。另一个文件用于展示第三个标签页“玩转数据”的片段。这是我们在上面没有做过的——这个标签页首先显示用户可以在标签页上做什么的解释,并为此使用 Markdown 文件。
首先,让我们分析仪表板。这是它的默认视图:
仪表板默认视图的片段。图片由作者提供
第二个标签页仅显示数据,所以在这里省略。第三个标签页提供了更多内容——请参见下面的截图中的解释。
仪表板第三个标签页的顶部。图片由作者提供
在“玩转 Iris 数据”标题下方和数据编辑器上方的内容都来自 play.md 文件。
标签页的剩余部分显示:
-
数据编辑器,用户可以在其中更改数据
-
数据的 SPLOM(散点图矩阵):
所有特征的 SPLOM 图。图片由作者提供
- 用户通过下拉菜单选择的特征的箱线图:
按物种选择的特征的箱线图。图片由作者提供
-
“刷新”按钮
-
自上次点击“刷新”按钮以来的更改日志:
所有这些标签页元素都直接包含在 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() 函数中阅读它要容易得多。比较:
例如,有这个:
结论
这很简单,对吧?你只需要将 Markdown 内容放入一个文件中,读取文件内容到对象中,然后将这个对象传递给st.markdown()函数。
当你需要在你 Streamlit 仪表板中包含较长的 Markdown 内容片段时,这个工具特别方便。对于较短的片段,直接在st.markdown()函数中包含它们更容易。
我已经使用这种方法创建了一些相当复杂的交互式仪表板,这些仪表板从多个 Markdown 文件中读取内容。我还发现 Streamlit 对于创建交互式演示文稿非常有用。Streamlit 非常适合这样的用途。然而,如果你在代码中包含所有的 Markdown 内容,它很快就会变得难以阅读——我讨厌难以阅读的代码。有一天,当我看到自己的 Streamlit 仪表板代码中充满了 Markdown 内容时,我想一定有更好的方法来做这件事。
确实如此。但这种方法还有一个额外的优势,你可能有时会认为它甚至比清晰的代码更重要:不仅这样的代码组织得更好,你还可以重用这些 Markdown 文件。例如,你可以创建一个 Markdown 文件,将所有这些文件的内容合并在一起。通常,Markdown 文件用于编写文档——你可以在仪表板上使用完全相同的文件,而无需复制粘贴其内容。对这样的文件的任何更新都将同时在仪表板和文档中可见。
最后,我想邀请你克隆这个仓库并在你的机器上构建仪表板。它包含的不仅仅是 Markdown 文件的使用演示。但我在那里使用的工具是另一个故事,我将在另一天和另一篇文章中讲述。
2061

被折叠的 条评论
为什么被折叠?



