Python使用Pyecharts制作可视化大屏:从数据清洗到布局配置
本文详解如何利用Python库Pyecharts制作可视化大屏。内容涵盖使用requests和pandas获取并清洗2020东京奥运会数据,通过Map、Bar、Pie绘制各类图表,并利用Page组件结合chart_config.json实现拖拽式自定义布局,最终生成静态HTML大屏文件。
前言
ECharts是百度开源的基于JavaScript的商业级数据图表库,提供了丰富的图表类型和示例。Pyecharts则是为了简化Python开发者使用ECharts进行绘图的过程而设计的工具。利用Pyecharts制作可视化大屏,主要包含两个步骤:
第一步,分别使用Pyecharts制作各类所需的图形;
第二步,利用Pyecharts的组合图表功能,将所有生成的图形拼接到一个HTML文件中进行统一展示。
作者认为,影响大屏美观度的最关键因素在于配色方案与整体布局。在本文中,将重点强调这两个方面的处理。
Pyecharts可视化实现
为了简化演示,本文仅选取了2020东京奥运会各国金牌分布图、奖牌榜详情以及中国各项目获奖详情这三类图表。
这类基础图表的实现较为简单,参考官方文档直接复制示例代码即可快速上手。图表配色默认采用Pyecharts的预设颜色,建议在实际项目中根据需求形成统一的视觉风格。
数据爬取与预处理
import requests import pandas as pd from pprint import pprint url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/total-table/15/110000004609' data1 = requests.get(url).json() pprint(data1)
世界地图绘制
在使用Pyecharts绘制世界地图时,地图中显示的国家名称必须为英文。因此,在前文步骤中引入了国家名称中英文对照表,并通过左连接操作生成了包含必要信息的DataFrame(df1):
df1 = pd.DataFrame()
for info in data1['body']['allMedalData']:
name = info['countryName']
name_id = info['countryId']
rank = info['rank']
gold = info['goldMedalNum']
silver = info['silverMedalNum']
bronze = info['bronzeMedalNum']
total = info['totalMedalNum']
# 组织数据
orangized_data = [[name,name_id,rank,gold,silver,bronze,total]]
# 然后追加df
df1 = df1.append(orangized_data)
df1.columns = ['名称', 'ID', '排名', '金牌', '银牌', '铜牌', '奖牌总数']
df1

url = 'https://app-sc.miguvideo.com/vms-livedata/olympic-medal/detail-total/15/110000004609' data2 = requests.get(url).json() pprint(data2)
df2 = pd.DataFrame()
for info in data2['body']['medalTableDetail']:
english_name = info['countryName']
name_id = info['countryId']
award_time = info['awardTime']
item_name = info['bigItemName']
sports_name = info['sportsName']
medal_type = info['medalType']
# 组织数据
orangized_data = [[english_name,name_id,award_time,item_name,sports_name,medal_type]]
# 然后追加df
df2 = df2.append(orangized_data)
df2.columns = ['英文缩写', 'ID', '获奖时间', '项目名', '运动员', '金牌类型']
df2

数据预处理环节
with open("国家名中英文对照表.txt","r",encoding="utf-8") as f:
x = f.read()
df3 = pd.DataFrame()
for i in x.split("\n"):
x = i.split(":")[0].strip()
y = i.split(":")[1].strip()
orangined_data = [[x,y]]
df3 = df3.append(orangined_data)
df3.columns = ["名称","英文名称"]
df3.to_excel("国家名中英文对照表.xlsx",index=None)
df4 = pd.merge(df1,df3,on="名称",how="left") df4.head(10)

df5 = df2
df6 = pd.merge(df4,df5,on="ID",how="left") df6.head(10)

df6

x = {"获奖名次":["金牌","银牌","铜牌"],"金牌类型":[1,2,3]}
df7 = pd.DataFrame(x)
df7

df8 = pd.merge(df6,df7,on="金牌类型",how="left") df8.head(10)

df4.head(10)

Pyecharts可视化配置
从处理后的数据中单独提取英文名称和奖牌总数这两列数据,用于后续的可视化展示。
data_list=[[i,j] for i,j in zip(df4['英文名称'],df4['奖牌总数'])] data_list[:5]

数据准备就绪后,开始利用Pyecharts绘制世界地图。
from pyecharts import options as opts
from pyecharts.charts import Map
c = (
Map()
.add("", data_list, "world",
is_map_symbol_show=False,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="2020东京奥运会各国总奖牌分布图"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
c.render_notebook()
实现过程非常简单

金牌总数统计
data_list1=[[i,j] for i,j in zip(df4['英文名称'],df4['金牌'])] data_list1[:5]
from pyecharts import options as opts
from pyecharts.charts import Map
c = (
Map()
.add("", data_list1, "world",
is_map_symbol_show=False,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="2020东京奥运会各国金牌分布图"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
c.render_notebook()

银牌总数统计
data_list2=[[i,j] for i,j in zip(df4['英文名称'],df4['银牌'])] data_list2[:5]
from pyecharts import options as opts
from pyecharts.charts import Map
c = (
Map()
.add("", data_list2, "world",
is_map_symbol_show=False,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="2020东京奥运会各国银牌分布图"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
c.render_notebook()

柱状图与饼图制作
柱状图(Bar)绘制
from pyecharts import options as opts
from pyecharts.charts import Bar
c = (
Bar()
.add_xaxis(df4['名称'].head(25).tolist())
.add_yaxis("金牌", df4['金牌'].head(25).tolist(), stack="stack1")
.add_yaxis("银牌", df4['银牌'].head(25).tolist(), stack="stack1")
.add_yaxis("铜牌", df4['铜牌'].head(25).tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=12, color='#FFFFFF'))
.set_global_opts(title_opts=opts.TitleOpts(title="2020东京奥运会奖牌榜详情"),
xaxis_opts=opts.AxisOpts(type_='category',
axislabel_opts=opts.LabelOpts(
rotate=45),
)))
c.render_notebook()

饼图(Pie)绘制
from pyecharts import options as opts
from pyecharts.charts import Pie
c = (
Pie()
.add("", [['跳水', 12], ['射击', 11], ['举重', 8], ['竞技体操', 8], ['乒乓球', 7], ['游泳', 6], ['羽毛球', 6], ['田径', 5], ['静水皮划艇', 3], ['蹦床体操', 3], ['自由式摔跤', 3], ['赛艇', 3], ['空手道', 2], ['拳击', 2], ['帆船', 2], ['花样游泳', 2], ['跆拳道', 1], ['场地自行车赛', 1], ['古典式摔跤', 1], ['击剑', 1], ['三人篮球', 1]],
center=["50%", "60%"],)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render_notebook()

至此,所需的基础三张图表均已绘制完成。
Pyecharts组合图表功能
Pyecharts实现可视化大屏的第二步是组合图表,主要包含四种模式:
- Grid:并行多图布局
- Page:顺序多图布局
- Tab:选项卡多图切换
- Timeline:时间线轮播展示
官方文档参考:Pyecharts
本文主要使用Page(顺序多图)模式。在组合图表之前,需先将前文绘制的图表代码重构为函数形式。
def map_world() -> Map:
c = (
Map(init_opts=opts.InitOpts(chart_id=2, bg_color='#ADD8E6'))
.add("", data_list, "world",
is_map_symbol_show=False,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="2020东京奥运会各国金牌分布图"),
visualmap_opts=opts.VisualMapOpts(max_=100)
)
)
return c
在重构过程中,增加了背景颜色参数bg_color和图表ID参数chart_id,后者用于在多图表场景中定位和区分不同图表。背景颜色选择了淡蓝色#ADD8E6。后续图片的布局是基于图表ID的对应关系进行配置的,因此每张图都需要单独设置其ID。
接着,使用page = Page(layout=Page.DraggablePageLayout)模式对图片进行展示,该步骤旨在调整布局。
page = Page(layout=Page.DraggablePageLayout, page_title="2020东京奥运会奖牌榜")
# 在页面中添加图表
page.add(
title(),
map_world(),
bar_medals(),
pie_china(),)
page.render('test.html')
调用绘制函数后,会生成一个名为test.html的文件。
打开该HTML文件后,可以通过拖拽其中的图片来实现自定义布局调整。

完成图片布局调整后,务必点击左上角的“save config”按钮以保存布局配置。
点击保存后,本地会生成一个chart_config.json文件,该文件记录了每个图表ID对应的具体布局位置信息。

最后,调用保存好的布局文件,重新生成最终的HTML文件。
运行以下代码:
page.save_resize_html('test.html', cfg_file='chart_config.json', dest='奥运.html')
其中,test.html为包含所有图表的基础文件,chart_config.json为刚才下载的布局配置文件,奥运.html为最终生成的布局好的仪表盘文件。打开奥运.html即可看到效果:

至此,实现了一次完整的数据可视化大屏展示。
然而,该方法仍存在诸多不足,例如若未对图表配色进行特殊调整,视觉效果可能较为普通。
生成的整张大屏仅为静态展示,不具备商业场景中常见的交互式数据仪表盘功能。

真正的商业数据大屏通常倾向于使用BI软件生成,能够实现图表、表格与切片器之间的交叉筛选功能。希望未来有机会能用Python实现类似的高级交互功能。
总结
到此,关于Python机器学习之Pyecharts制作可视化大屏的文章介绍完毕。更多相关Pyecharts可视化大屏内容,请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













