Shiny库是一个可以让人用来构建交互式Web应用程序的框架, 这个框架是在R语言里面进行构建起来的。
这个库是由同一支开发团队所创建的, 而该团队正是R语言的Shiny库背后的主力队伍。对于那部分数据科学家以及分析师而言, 他们的需求是要构建出具有交互功能的仪表盘应用程序。但是, 这部分人群并不具备广泛的前端开发技能, 因此这个库对他们来说就特别有好用之处。
Shiny能做什么? 它可以做交互式数据可视化。就是说, 它允许用户创造那种交互式的可视化工具。这些工具能够根据用户的输入来作出动态的更新。这点对探索性的数据分析以及提升用户之间的互动体验来说, 是相当有帮助的。它还可以做仪表板的创建。
利用SHiny这一点的话, 把来自多个不同数据源还有各种各样的可视化的内容都聚合在一起的、综合性的仪表盘的制作过程就会变得比较轻松地实现出来。
交互式应用程序是 Shiny 的一个用途, 它可用于开发允许用户和数据进行实时交互的应用程序, 具体的例子包括对数据集进行过滤、应用统计模型以及生成报告, 原型制作与共享也是其特点之一, 数据科学家可以快速地制作出数据应用程序的原型, 并且可以向任何人进行分享, 另外由于它与某些工具的集成, 使得 Shiny 能够提供多种多样的交互式地图以及图表。
大家可能会问, 它在使用难度方面到底是什么一个情况呢? 接下来我们将引入到一个十分简单的数据集之中, 并结合基础层面的交互类型的数据可视化功能来做一个实际的尝试过程。
数据集
对于这个相关的练习活动来讲, 我们是打算去采用一个非常直白、极其浅近的数据资料来进行处理的, 而这一份所谓的全球幸福指数方面的信息内容呢, 则是可以被寻找到于这里这个位置处所在的地方。
我把文件下载好, 然后进行解压缩操作,最后把那些解包出来的东西给存成一个后缀是.csv的文件格式。
在这个CSV文件中头, 与这个情况相关联的那些字段是:
这里的国家名称指的是每一个具备幸福这种价值的国家的名字, 年份则是记录这些数据的年份, 而生命阶梯是一个包含实际幸福价值的领域, 这个价值越大的话, 该国就越幸福。
借助这个数据集, 我们能够运用相关工具, 对国家开展全球范围的对比分析, 说不定还能进一步实现区域性的比较观察。
其实有一种东西, 它能够作为一个非常好的开始工具, 那就是地图。
地图会使用预定义区域, 这也就是国家。在里面, 它会用阴影或者颜色差异这种方式。来去指示该地区特定数量的平均值存在的情况。
比如我们可以运用更深层次的阴影表现方法, 以此来对幸福价值相对较高的那些国家进行区分和呈现。
因此, 通过创建一个包含两个组件的交互式数据可视化应用, 从而使Shiny在此处得以发挥作用。
用户可以通过下拉菜单来选定具体的年份, 而该数据集本身是涵盖了从二零零五年直至二零二二年这个时间段里面的所有数据信息的;在全球地图这一板块里面呢, 则是会根据用户刚才选定的那个特定年份的数值信息, 从而在世界地图上分别去显示出各个国家所对应的那个具体情况。
我们来试着把这个过程弄成一个个的独立部分来处理, 第一步就是把所需要的库全都加载进来, 并且把我的数据集也准备好。
1.把相关的库加载进来, 同时把数据集合一起处理掉。
在运行这个应用程序之前, 我们得确保已经安装好了这三个关键的库。因为要成功让这个程序跑起来, 全靠这三个库撑着。至于怎么安装它们, 后面的步骤里头会写得很清楚, 到时候照着做就行。先别急着启动, 把这三个库弄好, 才是正经事。
将熊猫导入为pd导入 plotly.express as px
从闪亮的导入应用程序,渲染,ui,反应
#用正确的分隔符加载数据集
file_path = 'world_happiness_2023.csv' # 确保这是您的CSV文件的正确路径
happiness_data = pd.read_csv(file_path, delimiter=',')
这里导入了一些必要的库(包括熊猫), 以便利用这个库去打开那份记录全世界幸福感的数据。这份数据被保存成了用逗号把各个部分隔开的文件形式, 为了让代码跑得通顺, 你必须确保这个文件和咱们正在编辑的这个文件待在同一个文件夹里面——当然啦, 如果你是在套用这个代码片段的话就更得这么做了。
2.定义用户界面(UI)
这就是我们一开始去使用闪亮库的那个点。回过头去看, 当我们把Shiny给加载进来的时候, 我们已经包含了ui这个库了, 为的是能够帮到我们, 方便我们去弄出那个Web应用程序界面。
# 定义用户界面app_ui = ui.page_fluid(
ui.h3(“世界幸福分析”),
ui.input_select(
"年", "选择一个年份:",
{str(year): str(year) for year in sorted(happiness_data['year'].unique())}
),
ui.output_ui(“幸福地图”)
)
那些变量, 它们实际上是被用来定义Web应用程序整体的布局情况的。并且这些变量所涵盖的内容还包括以下这些具体的项目:
3.定义服务器逻辑
当我们把界面布置好以后, 我们就可以进行服务器代码的设置工作:
# 定义服务器逻辑def服务器(输入、输出、会话):
@reactive.Calc
def filtered_data():
返回 happiness_data[happiness_data['year'] == int(input.year())]
服务器功能定义了应用程序的逻辑, 并且它包含一个反应式的计算函数, 这个计算函数会根据选中的年份来对数据集执行过滤操作。
4.关于那个被使用的编码地图, 大家心里都是相当的高兴。
这个代码段的核心关注点是在()这个函数上面, 因为这个函数会使用像素, 也就是用(px)作为单位来负责把映射的结果渲染出来:
@输出@render.ui
def happiness_map():
数据 = filtered_data()
图 = px.choropleth(
数据,
locations='Country name', # 使用国家/地区名称作为地点
locationmode='country names', # 指定我们使用的国家名称
color='Life Ladder', # Use 'Life Ladder' for happiness values
hover_name='Country name', # 使用'Country name'作为悬停信息
color_continuous_scale=px.colors.sequential.YlGnBu,
labels={'Life Ladder': 'Life Ladder Score'},
title=f'世界幸福在{input.year()}'
)
fig.update_layout(height=600, margin={"r":0,"t":40,"l":0,"b":0})
fig_html = fig.to_html(full_html=False)
返回ui.HTML(fig_html)
关键的属性是, 在这里面, 它们是被作为参数给传递出去了。
对地图进行更新, 从而适应所指定的高度和边距部分, 这一操作是通过调用那个用括号括起来的函数来实现的。
5.创建应用程序并且运行该应用程序。
在这一部分里面呢, 会把那个Shiny应用给它初始化一下, 然后让它跑起来。
#创建应用程序app = App(app_ui,服务器)
如果__name__ == '__main__':
app.run()
它将用户界面向导与服务器端组件连接在一起, 使应用程序的各项功能得以正常运转, 并且准备好在网页浏览器中展示给用户看。
这就是我们现在所需要的所有代码了, 如果要去运行这个应用程序的话, 你是可以选用那一种方式来进行操作的, 或者是像我刚才所展示的那样去进行使用也是完全没有任何问题的, 至于我个人来说的话, 直至今日为止我对于所谓 shiny 这个东西的亲身经历和了解程度都是特别稀少的, 但是要在某个具体的环境或者软件当中去把它给成功地运行起来的那个操作流程其实是非常非常的简单易懂的。
首先来说, 我是从那个地方的首选项里面, 找到项目这一栏, 再往下找解释器这个地方, 从而就把相关的库给安装好了的。
在对应平台上面, 把Shiny这个库给安装成功。
在进行安装操作之后, 我现在可以从那个自带的终端窗口里面, 通过找到“视图”, 然后选择“工具”, 接着再点击“终端”这个路径来运行我们要用的文件, 这就相当于是作为一个正在运行的闪亮应用一样。
以及我们展现出来的那种极度流畅的视觉吸引效果的结果。
这个情况是不错的。用户能够去点那个下拉菜单, 在下拉菜单里面选择二零〇五年到二零二三年之间对应的那个具体的年份, 而且在这个时候, 显示出来的那个地图会自己更新一下。
你干得相当不错。我期望你能想办法把这个东西让它能够开始工作并且保持一个正常的运行状态。如果你存在一些任何疑问或者困难, 请你把相关的意见给发表出来, 并告知于我得知情况以便我能知晓问题所在。
干得好!
总而言之, 就是这么个意思了。
Shiny, 它是数据科学家所使用的那种用来进行数据可视化的工具列表里面的另外一项东西, 它的功能是比较简单的, 也就是能够让你去创建那些带有互动性质还有动态效果的数据可视化内容。
说句不绕弯子的话, Shiny这个工具在渲染数据可视化的时候表现得很轻松。这种能力, 直接就让它的吸引力变大了很多。
把这个框架拿去和另一个同样热门而且很像的框架做个横向比较, 就会发现前者存在一个特别大的优势, 这个优势主要体现在运行效率方面, 因为它的执行机制只针对那些确实需要发生改变的部分代码进行重新运算, 而不会全盘推翻重来, 这一点是区别于其他平台的亮点所在。
当然, 我们也不能忽略另外一个环节, 当用户往里面填入具体的输入内容之后, 系统还是会按照完整的流程, 把这个应用程序的全部脚本都重新呈现一遍。
恰恰相反, 对于没有经验的UI开发人员而言, 更容易让项目启动并运行。我在和中创建了完全相同的应用程序。这个应用程序由30行代码构成, 而Shiny应用程序则包含了50行代码。
那个看得到效果的最终结果? 跟原本的状况相比, 简直是完全的一模一样。
感谢您的阅读。