Shiny,一个超酷的 Python 库

大侠幸会幸会 [ 抱拳 ],我是 算法金;0 基础跨行转算法并成功上岸;正在挑战 [ 日更万日,让更多人享受智能乐趣 ]

​01. Shiny 概要

Python 的 Shiny 库是一个强大的工具,用于构建交互式的网络应用。

它让 Python 代码能够轻松地创建和管理网页界面,同时支持动态响应各种事件,如按钮点击或下拉选择。

https://github.com/posit-dev/py-shiny

Shiny 应用的结构

一个 Shiny 应用通常包含两个部分:用户界面(UI)和服务器函数。

这两部分通过shiny.App对象结合在一起。

例如,一个简单的 Shiny 应用可能看起来像这样:

from shiny import App, ui

# UI 部分
app_ui = ui.page_fluid("Hello, world!")

# 服务器逻辑
def server(input, output, session):
    pass

# 将 UI 和服务器逻辑结合成一个 Shiny 应用
app = App(app_ui, server)

实现交互性

Shiny 的核心在于其交互性。

你可以在 UI 中添加输入(如滑块)和输出(如文本框),然后在服务器逻辑中处理这些输入,并将结果动态显示在输出中。例如:

from shiny import App, ui

app_ui = ui.page_fluid(
    ui.input_slider("n", "选择一个数字 n:", 0, 100, 40),
    ui.output_text_verbatim("txt")
)

def server(input, output, session):
    @output
    @render.text
    def txt():
        return f"n 的两倍是 {input.n() * 2}"

app = App(app_ui, server)

来一发动图感受一下交互效果

布局和样式

Shiny 还提供了多种布局和样式选项,让您可以定制应用的外观。

你可以使用侧边栏布局、标签导航、卡片等组件来组织您的 UI。

所有的 UI 组件实际上都是 HTML,这意味着如果你熟悉 HTML,将更容易理解和使用 Shiny。

02. 效果图

官方给出了几个展示,感受一下(下方为图片,实际上是动态和交互的

模型效果监测仪表板

轨道模拟交互界面

呼吸系统疾病数据交互界面

正则化强度效果交互界面

空气质量交互

CPU 使用率监测

03. 实际案例

创建一个 X 分析仪表板

(原 Twitter)

有个歪果小哥哥写了篇文章,介绍了如何利用Python的Shiny库结合rtweet包,来创建一个展示Twitter用户数据的交互式仪表板。

用户界面

这个应用将使用一个源文件(app.py)来创建用户界面和服务器端逻辑。首先,我们创建用户界面。

UI采用各种输入和输出函数,并定义了用户访问仪表板时看到的内容。

{shiny}包提供了一个ui模块,其中包含了快速创建布局、输入和输出的各种函数。

# 导入shiny的ui模块
from shiny import ui

# 创建一个全宽度的页面布局
app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(),
        ui.panel_main()
    )
)

输入和输出

现在,我们将在UI中放置一些输入和输出函数。这些函数遵循一种可预测的格式,易于记忆:

  • ui.input_用于输入,它们从用户那里获取值,并将它们发送到服务器;
  • _ui.output__用于输出,它们将从服务器接收数据并在客户端呈现。

对于我们的Twitter仪表板,我们需要一个图表(ui.output_plot()),显示不同因素如何影响推文的互动次数。

我们还将有一个表格(ui.output_table()),显示发布的最新推文。在表格上方,有一些描述性文本(ui.output_text()),说明正在查看的推文数量。

# 导入shiny的ui模块
from shiny import ui

# 定义用户界面的选择和复选框
choices_select = {
    "year": "年份",
    "day": "日",
    "hour": "小时",
    "media_type": "媒体类型"
}
choices_check = {
    "created_at": "日期",
    "text": "文本",
    "retweet_count": "转发数",
    "favorite_count": "点赞数"
}

# 创建用户界面
app_ui = ui.page_fluid(
    ui.layout_sidebar(
        ui.panel_sidebar(
            ui.input_select(
                id="x", label="X轴变量", choices=choices_select, selected="year"
            ),
            ui.input_numeric(
                id="num",
                label="你想查看多少条推文?",
                value=0,
                min=0,
                max=50
            ),
            ui.panel_conditional(
                "input.num > 0 && input.num <= 50", 
                ui.input_checkbox_group(
                    id="cols",
                    label="选择你想查看的变量:",
                    choices=choices_check,
                    selected=["created_at", "text"],
                )
            )
        ),
        ui.panel_main(
            ui.output_plot("plot"), ui.output_text("text"), ui.output_table("table")
        )
    )
)

服务器函数

我们的服务器函数将接受三个参数:input、output和session,每个参数都将在运行应用程序时传递给我们的函数。

input参数提供了对通过其id绑定到input_X UI函数的值的访问,output为我们提供了一个地方来指导内容的呈现,session包含了与应用程序连接的浏览器会话的一些特定数据。

# 导入所需模块
import pandas as pd
import plotnine as gg

# 读取数据
jr = pd.read_csv("jr_shiny.csv")
jr = jr.astype({"day": "object"})

# 定义服务器函数
def server(input, output, session):
    @output
    @render.plot
    def plot():
        avg_int = jr.groupby(input.x(), as_index=False).agg(
            {"retweet_count": "mean", "favorite_count": "mean"}
        )
        avg_int = pd.melt(avg_int, id_vars=input.x())
        plot = (
            gg.ggplot(avg_int, gg.aes(input.x(), "value", fill="variable"))
            + gg.geom_col(position="dodge")
            + gg.ylab("平均互动次数")
            + gg.scale_fill_brewer(
                type="qual",
                palette="Dark2",
                name="互动类型",
                labels=["点赞", "转发"],
            )
            + gg.theme_classic()
        )
        if input.x() == "day":
            return plot + gg.scale_x_discrete(
                labels=["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
            )
        else:
            return plot

    @output
    @render.text
    def text():
        if input.cols() == () or input.num() <= 0 or input.num() > 50:
            return ""
        elif input.num() == 1:
            return "展示最新的@jumping_uk推文:"
        else:
            return f"展示最新的{input.num()}条@jumping_uk推文:"

    @output
    @render.table
    def table():
        cols = jr.filter(input.cols())
        cols.rename(
            columns={
                "created_at": "日期",
                "text": "文本",
                "retweet_count": "转发数",
                "favorite_count": "点赞数",
            },
            inplace=True,
        )
        pd.set_option("colheader_justify", "left")
        first_n = cols.head(input.num())
        if input.num() <= 0 or input.num() > 50:
            return None
        else:
            return first_n

收尾工作

App类允许我们定义一个包含UI内容和服务器函数的对象。

# 导入App类
from shiny import App

# 创建应用实例
app = App(app_ui, server)

# 运行应用
shiny run --reload app

效果图

这个简单的示例展示了如何利用Shiny库和Twitter API构建一个展示Twitter用户数据的仪表板。

通过扩展代码和功能,可以实现更复杂的数据分析和可视化效果。

如果需要更多的功能或者有具体的需求,可参考具体的教程或文档。

疫情可视化仪表盘

  • 《一个访问量高达1300万的shiny应用的诞生故事》

Shiny app链接:https://github.com/swsoyee/2019-ncov-japan

  • 这个是一个在日本的中国留学生在新冠疫情之初,用Shiny做的日本新冠疫情可视化仪表盘界面。

作者也展示了这个项目从最开始简单的原型一步步更新迭代到现在的版本的历程。

   _____                   _ 
  / ____|                 | |
 | |        ___     ___   | |
 | |       / _ \   / _ \  | |
 | |____  | (_) | | (_) | | |
  \_____|  \___/   \___/  |_|
                             


抱个拳总个结

我们通过实例展示了如何使用 Python 的 Shiny 库创建交互式表板,突出了Shiny在数据可视化和网络应用开发中的实用性和灵活性。

Shiny不仅为专业开发者提供了强大工具,也为数据爱好者和跨领域专业人士提供了易于上手的解决方案。

未来,Shiny的发展可能进一步丰富数据分析和可视化的领域,激发更多创新应用。

Enjoy~

以上就是“Shiny,一个超酷的 Python 库”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值