我用这个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 )
小贴士:
使用深色背景可以让数据更醒目
合理使用颜色主题能提升视觉效果
图表布局可以拖拽调整,记得保存布局配置
进阶优化
想让大屏更专业?试试这些技巧:
添加自动刷新功能
加入数据筛选功能
实现图表联动
添加动画效果
一个简单的自动刷新示例:
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
小贴士:
定期清理历史数据,避免内存占用过大
添加错误处理机制,确保数据更新异常时不影响展示
可以用WebSocket替代HTTP轮询,提高实时性
建议添加加载动画,提升用户体验
性能优化
如果数据量较大,可以考虑这些优化方案:
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}'}
好啦,这就是我们的进阶版数据大屏啦!动手试试吧,相信你一定能制作出更炫酷的可视化作品!
小伙伴们,如果你也做出了好看的数据大屏,欢迎在评论区分享你的作品!我们下期见!