【实战】Streamlit+ECharts绘制多图表可视化大屏,超级实用

2023-09-19 11:48:36

实战项目背景介绍

当我们提到数据可视化,常常会想到众多的工具和库,如 MatplotlibSeaborn 甚至于 D3.js 等。但是,有一个特定的组合正在快速走红:StreamlitEChartsStreamlit,作为一个轻量级的 Python 工具,允许数据科学家和工程师轻而易举地创建交互式的 web 应用。而 ECharts,一款来自百度的开源 JavaScript 可视化工具,因其绚丽的效果和广泛的图表类型而广受欢迎。

f7addc006f19125078990b9e7eba63c8.png

那么,为何我们要将 StreamlitECharts 结合呢?首先,ECharts 提供了一种动态、生动的方式来展示数据,这种方式往往比传统的静态图表更具吸引力。而 Streamlit 的简洁性和灵活性确保了我们可以快速部署应用,无需深入的前端开发经验。将这两者结合,我们可以在短时间内制作出既美观又功能强大的数据可视化大屏。

在上篇文章当中,我们简单地介绍了将 StreamlitECharts 结合来简单地绘制一些图表。Streamlit+Echarts画出的图表,真的是太精湛了!!在本文中,我们将深入探讨如何通过上面两者来制作可视化大屏。无论您是一个经验丰富的开发者还是一个初学者,都能从这个结合中获得启示和灵感。

代码结构

我们先来看一下整个项目的代码结构,如下图所示

341699b17a200bbd47b7703195c77317.png

分为 ECharts 的演示 demo 以及 PyeCharts 的演示 demo。我们可根据下拉框来指定是选择用 ECharts 或者是 PyeCharts 来进行图表的绘制,然后我们在具体的图表例子中可以选择一个、例如是折线图、柱状图或者是饼图以及散点图等等,具体的代码如下

def main():
    st.title("Streamlit ECharts 演示")

    with st.sidebar:
        st.header("配置")
        api_options = ("echarts", "pyecharts")
        selected_api = st.selectbox(
            label="选择",
            options=api_options,
        )

        page_options = (
            list(ST_PY_DEMOS.keys())
            if selected_api == "pyecharts"
            else list(ST_DEMOS.keys())
        )
        selected_page = st.selectbox(
            label="选择一个图表的例子",
            options=page_options,
        )
        demo, url = (
            ST_DEMOS[selected_page]
            if selected_api == "echarts"
            else ST_PY_DEMOS[selected_page]
        )

        if selected_api == "echarts":
            st.caption(
                """ECharts demos are extracted from https://echarts.apache.org/examples/en/index.html, 
            by copying/formattting the 'option' json object into st_echarts.
            Definitely check the echarts example page, convert the JSON specs to Python Dicts and you should get a nice viz."""
            )
        if selected_api == "pyecharts":
            st.caption(
                """Pyecharts demos are extracted from https://github.com/pyecharts/pyecharts-gallery,
            by copying the pyecharts object into st_pyecharts. 
            Pyecharts is still using ECharts 4 underneath, which is why the theming between st_echarts and st_pyecharts is different."""
            )
    demo()
    sourcelines, _ = inspect.getsourcelines(demo)
    with st.expander("源代码"):
        st.code(textwrap.dedent("".join(sourcelines[1:])))
    st.markdown(f"Credit: {url}")

output

4289837af3b0c18a572c9ab788eb85fa.png

例如我们指定用 ECharts 来绘制一张简单的折线图,代码就这么来写就行

def render_basic_line_chart():
    option = {
        "xAxis": {
            "type": "category",
            "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        },
        "yAxis": {"type": "value"},
        "series": [{"data": [820, 932, 901, 934, 1290, 1330, 1320], "type": "line"}],
    }
    st_echarts(
        options=option, height="400px",
    )

当然在此基础之上,我们可以进行一层衍生,例如在折线图的基础之上做一个面积图,又或者是绘制多条折线图等等,代码如下

def render_basic_area_chart():
    options = {
        "xAxis": {
            "type": "category",
            "boundaryGap": False,
            "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
        },
        "yAxis": {"type": "value"},
        "series": [
            {
                "data": [820, 932, 901, 934, 1290, 1330, 1320],
                "type": "line",
                "areaStyle": {},
            }
        ],
    }
    st_echarts(options=options)

或者是多条折线图的图表绘制,我们也可以将其定义到一个函数当中去,代码如下

def render_stacked_line_chart():
    options = {
        "title": {"text": "折线图堆叠"},
        "tooltip": {"trigger": "axis"},
        "legend": {"data": ["邮件营销", "联盟广告", "视频广告", "直接访问", "搜索引擎"]},
        "grid": {"left": "3%", "right": "4%", "bottom": "3%", "containLabel": True},
        "toolbox": {"feature": {"saveAsImage": {}}},
        "xAxis": {
            "type": "category",
            "boundaryGap": False,
            "data": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
        },
        "yAxis": {"type": "value"},
        "series": [
            {
                "name": "邮件营销",
                "type": "line",
                "stack": "总量",
                "data": [120, 132, 101, 134, 90, 230, 210],
            },
            {
                "name": "联盟广告",
                "type": "line",
                "stack": "总量",
                "data": [220, 182, 191, 234, 290, 330, 310],
            },
            {
                "name": "视频广告",
                "type": "line",
                "stack": "总量",
                "data": [150, 232, 201, 154, 190, 330, 410],
            },
            {
                "name": "直接访问",
                "type": "line",
                "stack": "总量",
                "data": [320, 332, 301, 334, 390, 330, 320],
            },
            {
                "name": "搜索引擎",
                "type": "line",
                "stack": "总量",
                "data": [820, 932, 901, 934, 1290, 1330, 1320],
            },
        ],
    }
    st_echarts(options=options, height="400px")

然后我们将所有定义的函数集合到一个字典当中去,代码如下

ST_LINE_DEMOS = {
    "Line: Basic Line Chart": (
        render_basic_line_chart,
        "https://echarts.apache.org/examples/en/editor.html?c=line-simple",
    ),
    "Line: Basic Area Chart": (
        render_basic_area_chart,
        "https://echarts.apache.org/examples/en/editor.html?c=area-basic",
    ),
    "Line: Stacked Line Chart": (
        render_stacked_line_chart,
        "https://echarts.apache.org/examples/en/editor.html?c=line-stack",
    ),
    ......
}

效果展示

那么除了折线图的 demo ,还有例如饼图的 demo 及其衍生、散点图的 demo 以及衍生等等,在图表的下面,我们还附上了具体的源码,如下图所示

我们来看一下最后的效果,如下所示

7e91e322196c82950e20f67e712b3401.gif

总结

在探索 StreamlitECharts 的强大组合后,我们可以确信,交互式数据可视化的未来异常明亮。这种结合为我们提供了一种有效、简洁且引人入胜的方式来呈现数据,让我们能够更加直观地理解复杂的信息。更重要的是,这种方式打破了数据科学家与前端开发者之间的障碍,允许我们集中精力于真正的数据挖掘和故事叙述。

b0b202bb24794855f442483019061a9c.png

要想获取该可视化大屏的源码,可在公众号后台回复【20230916】即可。

NO.1

往期推荐

Historical articles

Pandas 2.0 vs Polars: 孰优孰劣?!

分享 5 款超级好用的Python可视化工具,建议收藏!!

【原创】强烈推荐三个可视化模块,绘制的图表真的很酷炫!!

嫌Python代码慢?这个模块让Python提效100倍!!

分享、收藏、点赞、在看安排一下?

9d50802fdb6f1469f884bfe124c43e94.gif

910c6c392e0ef2d3f01aca38b5aa6663.gif

2ab8010681757bca2f36e7ddb650195f.gif

6eaa79537256bedb8e4a53e1dd566cc1.gif

更多推荐

新消费降温,良品铺子还能走多远?

如果时间倒退到多年前,杨红春应该不会料到现在良品铺子的境遇。从2006年创立至今,前半段良品铺子经历了品牌升级,从线下发展到平台电商、社交电商,做APP客户端进行全渠道的营销,把一家曾入不敷出的小店,养成年利润过亿的高端零食大公司,似乎每一步都精准地踏在时代的节骨眼上。行业层面,国内零食市场规模也从杨红春刚创业时的数千

Next.js 13 服务器组件和应用目录完整指南

通过关于使用服务器组件和应用程序目录的最完整和最权威的教程,释放Next.js13的全部潜力。目录Next.js13带来了什么?服务器组件(RSC)布局ServerActions服务器操作EnhancedRouter增强型路由器什么是服务器组件?服务器组件与客户端组件定义服务器组件定义客户端组件App应用目录文件结构托

Docker 架构解析:理解 Docker 引擎和容器运行时

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

【计算机组成原理】读书笔记第四期:从源文件到可执行文件

目录写在开头从源代码到本地代码源代码本地代码的初级形态(这一节有点不严谨)编译器从目标文件到可执行文件启动和库文件DLL文件及导入库可执行文件的运行机制变量和函数的内存地址程序加载时生成栈和堆结尾写在开头本文继续阅读总结《程序是怎样跑起来的》这本书(作者:矢泽久雄)。前三篇博客介绍了这本书的阅读感受,并分别对第一章CP

如何修复msvcp140.dll文件,msvcp140.dll丢失的解决方法

在使用电脑的过程中,可能会遇到提示“msvcp140.dll丢失”的错误。这通常是由于某些程序或游戏在运行时需要调用msvcp140.dll文件,但由于某种原因(如病毒感染、误删等),该文件被删除或损坏,导致程序无法正常运行。解决方法1.重新安装相关程序当出现msvcp140.dll丢失的错误时,首先尝试重新安装出现问

Haproxy集群与常见的Web集群调度器

文章目录1.Web集群调度器概述1.1Web集群调度器简介1.2调度器类别1.2.1常用软件类1.2.2常用硬件类2.Haproxy软件介绍2.1Haproxy简介2.2支持功能2.3主要特性2.4常用调度算法2.4.1轮询:RR(RoundRobin)2.4.2最小连接数:LC(LeastConnections)2.

MongoDB-1入门介绍

NoSQLNoSQL(NoSQL=NotOnlySQL),意即反SQL运动,指的是非关系型的数据库优点1、对数据库高并发读写。2、对海量数据的高效率存储和访问。3、对数据库的高可扩展性和高可用性。弱点:1、数据库事务一致性需求2、数据库的写实时性和读实时性需求3、对复杂的SQL查询,特别是多表关联查询的需求简介Mong

【小沐学NLP】关联规则分析Apriori算法(Mlxtend库,Python)

文章目录1、简介2、Mlxtend库2.1安装2.2功能2.2.1UserGuide2.2.2UserGuide-data2.2.3UserGuide-frequent_patterns2.3入门示例3、Apriori算法3.1基本概念3.2apriori3.2.1示例1--生成频繁项集3.2.2示例2--选择和筛选结

nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

Vulnhub实战-prime1

前言VulnHub是一个面向信息安全爱好者和专业人士的虚拟机(VM)漏洞测试平台。它提供了一系列特制的漏洞测试虚拟机镜像,供用户通过攻击和漏洞利用的练习来提升自己的安全技能。本次,我们本次测试的是prime1。一、主机发现和端口扫描查看Vmware中靶机的MAC地址,方便与之后nmap扫描出来的主机的MAC地址进行对比

第32章_瑞萨MCU零基础入门系列教程之DS18B20温度获取实验

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

热文推荐