Python:一天开发了个数据大屏!(PyEcharts)

文摘   2024-11-22 16:46   辽宁  

我用这个Python库一天开发了个数据大屏!(PyEcharts)

今天想跟大家分享一个特别实用的Python数据可视化库 - PyEcharts。通过这个强大的工具,我们可以轻松制作出专业级的数据大屏展示。不需要复杂的前端知识,只要会Python就能做出超酷的可视化效果!

准备工作

首先安装PyEcharts:

1pip install pyecharts

我们将使用一个超市销售数据集作为示例,包含订单编号、商品类型、销售额等信息。

第一步:绘制商品分布饼图

先来个简单的饼图,展示不同商品类型的销售分布:

 1from pyecharts.charts import Pie
2from pyecharts import options as opts
3from pyecharts.globals import ThemeType
4
5def create_pie_chart(data_df):
6    # 统计商品类型分布
7    type_counts = data_df[“商品类型”].value_counts()
8
9    pie = (
10        Pie(init_opts=opts.InitOpts(bg_color='#1C1C1C', theme=ThemeType.DARK))
11        .add(
12            “”,
13            [list(z) for z in zip(type_counts.index, type_counts.values)],
14            radius=[“40%”, “75%”]
15        )
16        .set_global_opts(
17            title_opts=opts.TitleOpts(
18                title=“商品类型分布”,
19                subtitle=“2021年第一季度”,
20                title_textstyle_opts=opts.TextStyleOpts(color=“#fff”)
21            )
22        )
23        .set_series_opts(label_opts=opts.LabelOpts(formatter=“{b}: {c}”))
24    )
25    return pie

第二步:添加销售地图

来个地图看看全国销售分布情况:

 1from pyecharts.charts import Map
2
3def create_sales_map(data_df)
4    # 按省份统计销售额
5    province_sales = data_df.groupby(“省份”)[“总价”].sum()
6
7    sales_map = (
8        Map(init_opts=opts.InitOpts(bg_color='#1C1C1C'))
9        .add(
10            “销售额”,
11            [list(z) for z in zip(province_sales.index, province_sales.values)],
12            “china”,
13            is_map_symbol_show=False
14        )
15        .set_global_opts(
16            title_opts=opts.TitleOpts(title=“全国销售分布”),
17            visualmap_opts=opts.VisualMapOpts(max_=province_sales.max())
18        )
19    )
20    return sales_map

第三步:销售时段分析

用柱状图展示各时段的销售情况:

 1from pyecharts.charts import Bar
2
3def create_time_bar(data_df)
4    # 统计每小时订单量
5    hour_stats = data_df[“小时”].value_counts().sort_index()
6
7    bar = (
8        Bar(init_opts=opts.InitOpts(bg_color='#1C1C1C'))
9        .add_xaxis(hour_stats.index.astype(str).tolist())
10        .add_yaxis(“订单量”, hour_stats.values.tolist())
11        .set_global_opts(
12            title_opts=opts.TitleOpts(title=“销售时段分布”),
13            xaxis_opts=opts.AxisOpts(name=“小时”),
14            yaxis_opts=opts.AxisOpts(name=“订单数”)
15        )
16    )
17    return bar

第四步:组合大屏展示

最后把所有图表组合到一起:

 1from pyecharts.charts import Page
2
3def create_dashboard():
4    page 
= Page(layout=Page.DraggablePageLayout)
5
6    # 添加所有图表
7    page.add(
8        create_pie_chart(df),
9        create_sales_map(df),
10        create_time_bar(df)
11    )
12
13    # 生成HTML文件
14    page.render(“sales_dashboard.html”)
15
16    # 保存布局配置
17    page.save_resize_html(
18        source=“sales_dashboard.html”,
19        cfg_file=“chart_config.json”,
20        dest=“final_dashboard.html”
21    )

小贴士:

  1. 使用深色背景可以让数据更醒目

  2. 合理使用颜色主题能提升视觉效果

  3. 图表布局可以拖拽调整,记得保存布局配置

进阶优化

想让大屏更专业?试试这些技巧:

  • 添加自动刷新功能

  • 加入数据筛选功能

  • 实现图表联动

  • 添加动画效果

一个简单的自动刷新示例:

 1def add_refresh_js(html_file):
2    with open(html_file, 'r', encoding='utf-8'as f:
3        content = f.read()
4
5    # 添加自动刷新脚本
6    refresh_js = “”“
7    <script>
8        setTimeout(function(){
9            window.location.reload();
10        }
, 300000);  // 5分钟刷新一次
11    </script>
12    ”“”
13
14    content = content.replace('</html>', f'{refresh_js}</html>')
15
16    with open(html_file, 'w', encoding='utf-8') as f
17        f.write(content)
18

好啦,这就是我用PyEcharts开发数据大屏的全过程。动手试试吧,相信你也能制作出专业的数据可视化作品!

小伙伴们,你们对数据可视化感兴趣吗?欢迎在评论区交流经验,我们一起进步!记得点赞收藏,下期见!

Python学习 #数据可视化 #PyEcharts# Python数据大屏实战进阶(二):交互式仪表盘开发

接着上一篇文章,今天我要教大家如何给数据大屏添加更多炫酷的交互功能。我们会学习如何制作带有实时数据更新的仪表盘、动态切换图表,以及更多实用的可视化技巧!

仪表盘开发

首先来制作一个实时显示销售额的仪表盘:

 1from pyecharts.charts import Gauge
2import random
3
4def create_gauge(value, title=“销售额完成率”):
5    gauge 
= (
6        Gauge(init_opts=opts.InitOpts(bg_color=“#0f375f”))
7        .add(
8            “销售指标”,
9            [(“完成率”, value)],
10            axisline_opts=opts.AxisLineOpts(
11                linestyle_opts=opts.LineStyleOpts(
12                    color=[(0.3, “#67e0e3”), (0.7, “#37a2da”), (1, “#fd666d”)],
13                    width=30
14                )
15            )
16        )
17        .set_global_opts(
18            title_opts=opts.TitleOpts(title=title),
19            legend_opts=opts.LegendOpts(is_show=False),
20        )
21    )
22    return gauge

动态折线图

添加一个可以实时更新的销售趋势图:

 1from pyecharts.charts import Line
2import datetime
3
4def create_dynamic_line():
5    line = (
6        Line(init_opts=opts.InitOpts(bg_color=“#0f375f”))
7        .add_xaxis([])
8        .add_yaxis(“销售额”, [])
9        .set_global_opts(
10            title_opts=opts.TitleOpts(title=“实时销售趋势”),
11            xaxis_opts=opts.AxisOpts(type_=“time”),
12            datazoom_opts=[opts.DataZoomOpts()],
13        )
14    )
15    return line
16
17def update_line_data(line_chart, new_data):
18    “”“更新折线图数据”“”
19    x_data = line_chart.options[“xAxis”][0][“data”]
20    y_data = line_chart.options[“series”][0][“data”]
21
22    current_time = datetime.datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)
23    x_data.append(current_time)
24    y_data.append(new_data)
25
26    # 保持最近30个数据点
27    if len(x_data) > 30:
28        x_data.pop(0)
29        y_data.pop(0)

数据自动刷新机制

实现一个数据自动更新的类:

 1class DataUpdater
2    def __init__(self, update_interval=5):
3        self.update_interval = update_interval  # 更新间隔(秒)
4        self.latest_data = {}
5
6    def fetch_new_data(self):
7        “”“模拟获取新数据”“”
8        return {
9            'sales': random.randint(1000, 10000),
10            'orders': random.randint(100, 1000),
11            'customers': random.randint(50, 500)
12        }
13
14    def update_dashboard(self):
15        “”“更新仪表盘数据”“”
16        new_data = self.fetch_new_data()
17        self.latest_data.update(new_data)
18        return self.latest_data
19
20# 创建JavaScript回调函数
21def generate_update_js():
22    return “”“
23    <script>
24        function updateData() {
25            fetch('/api/dashboard-data')
26                .then(response => response.json())
27                .then(data => {
28                    // 更新各个图表
29                    myChart.setOption({
30                        series: [{
31                            data: data.series
32                        }]
33                    });
34                });
35        }
36        setInterval(updateData, 5000);
37    </script>
38    ”“”

交互式筛选器

添加时间和地区筛选功能:

 1from pyecharts.components import Select
2
3def create_filters():
4    # 时间筛选器
5    time_filter 
= (
6        Select()
7        .add_js_funcs(“function onChange(params){console.log(params)}”)
8        .add_select(
9            [“今日”, “本周”, “本月”, “本季度”],
10            default_selected_index=0
11        )
12    )
13
14    # 地区筛选器
15    area_filter = (
16        Select()
17        .add_js_funcs(“function onChange(params){console.log(params)}”)
18        .add_select(
19            [“全国”, “华东”, “华北”, “华南”],
20            default_selected_index=0
21        )
22    )
23
24    return time_filter, area_filter

图表联动效果

实现点击地图联动更新其他图表:

 1def add_chart_connect()
2    map_chart = create_sales_map(df)
3    pie_chart = create_pie_chart(df)
4
5    # 添加地图点击事件
6    map_chart.on_event('click', {
7        'function': '''
8            function(params) {
9                // 更新饼图数据
10                const pieChart = echarts.getInstanceByDom(
11                    document.getElementById('
pie-chart')
12                );
13                pieChart.setOption({
14                    series: [{
15                        data: getProvinceData(params.name)
16                    }]
17                });
18            }
19        '
''
20    })
21
22    return map_chart, pie_chart

完整仪表盘整合

最后把所有组件整合到一起:

 1def create_complete_dashboard():
2    page 
= Page(layout=Page.DraggablePageLayout)
3
4    # 创建组件
5    gauge = create_gauge(75.5)
6    line = create_dynamic_line()
7    time_filter, area_filter = create_filters()
8    map_chart, pie_chart = add_chart_connect()
9
10    # 添加组件
11    page.add(
12        gauge,
13        line,
14        time_filter,
15        area_filter,
16        map_chart,
17        pie_chart
18    )
19
20    # 添加自动更新
21    updater = DataUpdater()
22
23    # 生成HTML
24    html_content = page.render_embed()
25    html_content = html_content.replace('</body>', 
26        generate_update_js() + '</body>')
27
28    with open('dashboard.html', 'w', encoding='utf-8'as f:
29        f.write(html_content)
30

小贴士:

  1. 定期清理历史数据,避免内存占用过大

  2. 添加错误处理机制,确保数据更新异常时不影响展示

  3. 可以用WebSocket替代HTTP轮询,提高实时性

  4. 建议添加加载动画,提升用户体验

性能优化

如果数据量较大,可以考虑这些优化方案:

 1# 数据压缩
2def compress_data(data_list)
3    “”“使用简单的数据压缩算法”“”
4    if not data_list:
5        return []
6    result = []
7    current = data_list[0]
8    count = 1
9
10    for i in range(1, len(data_list)):
11        if data_list[i] == current:
12            count += 1
13        else
14            result.append([current, count])
15            current = data_list[i]
16            count = 1
17
18    result.append([current, count])
19    return result
20
21# 数据缓存
22from functools import lru_cache
23
24@lru_cache(maxsize=128)
25def get_cached_data(date_key)
26    “”“缓存常用数据查询”“”
27    # 实际项目中替换为数据库查询
28    return {'data': f'cached_data_{date_key}'}

好啦,这就是我们的进阶版数据大屏啦!动手试试吧,相信你一定能制作出更炫酷的可视化作品!

小伙伴们,如果你也做出了好看的数据大屏,欢迎在评论区分享你的作品!我们下期见!


家居设计师茉莉
爱家居、爱设计!
 最新文章