Python使用Pyecharts制作可视化大屏:从数据清洗到布局配置

阿麦
阿麦
发布时间:2026-10-12 | 2人浏览过
原创

本文详解如何利用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可视化大屏内容,请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表