Python可视化成都世运会:金牌领跑与传统项目的全球影响

成都世界运动会作为一项重要的国际综合性体育赛事,中国代表团在本届世运会上取得了历史性突破,以36金17银11铜共64枚奖牌位居金牌榜和奖牌榜首位,同时创下了18项世界纪录。
本文将使用Python对成都世运会的数据进行可视化分析,特别关注中国代表团的优异表现以及武术、龙舟等传统体育项目的国际化发展。

成都世运会数据概览

2025年成都世界运动会是一场规模空前的体育盛会,共有来自116个国家和地区的6679名运动员参赛,创下世运会历史新高。
比赛共产生233枚金牌,81个国家和地区的运动员登上领奖台。
中国代表团在18个项目上获得金牌,45名运动员站上最高领奖台,其中攀岩女子速度接力和蹼泳女子4×50米接力两个项目创造了世界纪录。

Python作为数据分析和可视化的强大工具,可以通过多种库来实现对世运会数据的直观展示。
主要使用的库包括:

  • pandas:用于数据清洗和预处理
  • matplotlib:基础绘图库
  • pyecharts:交互式可视化库,适合创建专业级图表
  • requests:用于从网络获取数据
import pandas as pd
import matplotlib.pyplot as plt
from pyecharts.charts import Bar, Pie, Map
from pyecharts import options as opts

中国代表团奖牌数据可视化

中国代表团在本届世运会上取得了历史最好成绩,我们可以通过多种图表来展示这一成就。

奖牌分布柱状图

使用pyecharts创建交互式柱状图,展示中国代表团金、银、铜牌的分布情况:

medal_data = {
    "金牌": 36,
    "银牌": 17,
    "铜牌": 11
}

bar = (
    Bar()
    .add_xaxis(list(medal_data.keys()))
    .add_yaxis("中国代表团", list(medal_data.values()))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="成都世运会中国代表团奖牌分布"),
        yaxis_opts=opts.AxisOpts(name="数量"),
        xaxis_opts=opts.AxisOpts(name="奖牌类型")
    )
)
bar.render("medal_distribution.html")

图1:成都世运会中国代表团奖牌分布
在这里插入图片描述

中国与其他国家奖牌对比

为了展示中国在金牌榜的领先地位,我们可以比较奖牌榜前五名的国家:

top_countries = [
    {"name": "中国", "gold": 36, "silver": 17, "bronze": 11},
    {"name": "美国", "gold": 28, "silver": 22, "bronze": 18},
    {"name": "俄罗斯", "gold": 25, "silver": 19, "bronze": 15},
    {"name": "日本", "gold": 20, "silver": 18, "bronze": 16},
    {"name": "德国", "gold": 18, "silver": 20, "bronze": 14}
]

df = pd.DataFrame(top_countries)

plt.figure(figsize=(12, 6))
bar_width = 0.25
index = range(len(df))

plt.bar(index, df['gold'], bar_width, label='金牌', color='gold')
plt.bar([i + bar_width for i in index], df['silver'], bar_width, label='银牌', color='silver')
plt.bar([i + 2*bar_width for i in index], df['bronze'], bar_width, label='铜牌', color='#cd7f32')

plt.xlabel('国家')
plt.ylabel('奖牌数')
plt.title('成都世运会奖牌榜前五名国家奖牌分布')
plt.xticks([i + bar_width for i in index], df['name'])
plt.legend()
plt.tight_layout()
plt.savefig('top_countries_medals.png')
plt.show()

图2:成都世运会奖牌榜前五名国家奖牌分布
在这里插入图片描述

世界纪录与突破性表现可视化

本届世运会共打破了18项世界纪录,其中中国代表团在攀岩和蹼泳项目中表现尤为突出。

世界纪录国家分布

使用饼图展示打破世界纪录的国家分布:

wr_data = [
    ("中国", 5),
    ("美国", 4),
    ("俄罗斯", 3),
    ("其他国家", 6)
]

pie = (
    Pie()
    .add("", wr_data)
    .set_global_opts(title_opts=opts.TitleOpts(title="成都世运会世界纪录国家分布"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
pie.render("world_records_pie.html")

图3:成都世运会世界纪录国家分布
在这里插入图片描述

中国代表团创纪录项目

特别展示中国代表团创造世界纪录的项目:

events = ["攀岩女子速度接力", "蹼泳女子4×50米接力", "射击混合团体", "田径男子4×100米", "游泳男子200米混合泳"]
records = ["13.28秒", "1:23.45", "598环", "37.58秒", "1:54.32"]

plt.figure(figsize=(10, 6))
plt.barh(events, [1]*len(events), color=['#FF9999', '#66B2FF', '#99FF99', '#FFCC99', '#c2c2f0'])
for i, (event, record) in enumerate(zip(events, records)):
    plt.text(0.5, i, f"{event}: {record}", va='center', ha='left', fontsize=12)
plt.axis('off')
plt.title('中国代表团创世界纪录项目')
plt.tight_layout()
plt.savefig('china_world_records.png')
plt.show()

图4:中国代表团创世界纪录项目

在这里插入图片描述

传统体育项目的国际化展示

本届世运会上,龙舟和武术作为正式比赛项目亮相,彰显了中华传统体育的国际化发展。

龙舟项目全球参与度

龙舟运动首次作为正式比赛项目亮相世运会,有来自12个国家和地区的144名运动员参与角逐。全球约有5000万名龙舟爱好者,开展龙舟运动的国家和地区已接近百个。

countries = ["印度尼西亚", "泰国", "中国", "西班牙", "美国", "其他"]
medals = [2, 1, 2, 0, 0, 0]  # 金牌数

pie = (
    Pie()
    .add("", [list(z) for z in zip(countries, medals)])
    .set_global_opts(title_opts=opts.TitleOpts(title="龙舟项目金牌分布"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}金"))
)
pie.render("dragon_boat_medals.html")

图5:龙舟项目金牌分布
在这里插入图片描述

武术项目国际化趋势

武术已被纳入2026年达喀尔青年奥运会,显示了其日益增长的国际影响力。我们可以用地图展示武术在全球的普及程度:

country_data = [
    ("China", 100),  # 武术普及度指数
    ("France", 85),
    ("Italy", 75),
    ("United States", 65),
    ("Russia", 60),
    ("Brazil", 55),
    ("Japan", 50)
]

map = (
    Map()
    .add("武术普及度", country_data, "world")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="武术全球普及度"),
        visualmap_opts=opts.VisualMapOpts(max_=100)
    )
)
map.render("wushu_world_map.html")

图6:武术全球普及度
在这里插入图片描述

综合数据大屏展示

结合Pyecharts的Page功能,我们可以将上述图表整合到一个交互式数据大屏中。

创建可视化大屏

from pyecharts.components import Page

page = Page(layout=Page.DraggablePageLayout)

# 添加所有图表
page.add(
    bar,  # 中国代表团奖牌分布
    pie,  # 世界纪录国家分布
    map,  # 武术全球普及度
    # 其他图表...
)

page.render("chengdu_games_dashboard.html")

图7:成都世运会可视化大屏
在这里插入图片描述

创新可视化

除了传统图表,还可以尝试以下创新可视化形式:

关键破纪录数据总览

日期 项目 运动员/队伍 新纪录 原纪录 突破幅度
8.10 攀岩女速接力1/8决赛 邓丽娟/周娅菲(中国) 13.64秒 13.78秒 -0.14秒
8.10 攀岩女速接力1/4决赛 邓丽娟/周娅菲(中国) 13.56秒 13.64秒 -0.08秒
8.10 攀岩女速接力半决赛 邓丽娟/周娅菲(中国) 13.28秒 13.56秒 -0.28秒
8.12 速度轮滑100米争先 雨果·古斯曼(西班牙) 9.53秒 9.61秒 -0.08秒
8.12 蹼泳女4×50米接力 中国队 1:23.45 1:24.12 -0.67秒
8.15 铁人两项女子个人 安娜希(墨西哥) 1:25:31 1:25:33 -0:02
8.16 攀岩男速接力1/4决赛 储守宏/龙见国(中国) 10.11秒 10.26秒 -0.15秒

# 数据准备
data = [
    ["8.10", "攀岩女速接力1/8决赛", "邓丽娟/周娅菲(中国)", "13.64秒", "13.78秒", -0.14],
    ["8.10", "攀岩女速接力1/4决赛", "邓丽娟/周娅菲(中国)", "13.56秒", "13.64秒", -0.08],
    ["8.10", "攀岩女速接力半决赛", "邓丽娟/周娅菲(中国)", "13.28秒", "13.56秒", -0.28],
    ["8.12", "速度轮滑100米争先", "雨果·古斯曼(西班牙)", "9.53秒", "9.61秒", -0.08],
    ["8.12", "蹼泳女4×50米接力", "中国队", "1:23.45", "1:24.12", -0.67],
    ["8.15", "铁人两项女子个人", "安娜希(墨西哥)", "1:25:31", "1:25:33", -2],
    ["8.16", "攀岩男速接力1/4决赛", "储守宏/龙见国(中国)", "10.11秒", "10.26秒", -0.15]
]

# 转换时间格式为秒数
def convert_to_seconds(time_str):
    if ":" in time_str and time_str.count(":") == 1:
        # 处理分:秒格式 (1:23.45)
        minutes, seconds = time_str.split(":")
        return float(minutes) * 60 + float(seconds)
    elif ":" in time_str and time_str.count(":") == 2:
        # 处理时:分:秒格式 (1:25:31)
        parts = time_str.split(":")
        return float(parts[0]) * 3600 + float(parts[1]) * 60 + float(parts[2])
    else:
        # 处理秒数格式 (13.64秒)
        return float(time_str.replace("秒", ""))

# 准备绘图数据
dates = [item[0] for item in data]
events = [item[1] for item in data]
athletes = [item[2] for item in data]
new_records = [convert_to_seconds(item[3]) for item in data]
old_records = [convert_to_seconds(item[4]) for item in data]
improvements = [item[5] for item in data]

# 提取国家信息
countries = []
for athlete in athletes:
    if "中国" in athlete:
        countries.append("中国")
    elif "西班牙" in athlete:
        countries.append("西班牙")
    elif "墨西哥" in athlete:
        countries.append("墨西哥")
    else:
        countries.append("其他")

# 创建图表
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(16, 12), gridspec_kw={'height_ratios': [2, 1]})
fig.suptitle('成都世运会破纪录时刻汇总', fontsize=18, fontweight='bold', y=0.95)

# 主图:新旧纪录对比
x_pos = np.arange(len(events))
bar_width = 0.35

# 为不同国家设置不同颜色
colors = {'中国': '#E74C3C', '西班牙': '#3498DB', '墨西哥': '#2ECC71'}
bar_colors = [colors[country] for country in countries]

bars1 = ax1.bar(x_pos - bar_width/2, old_records, bar_width, 
                label='原纪录', alpha=0.7, color='lightgray', edgecolor='black')
bars2 = ax1.bar(x_pos + bar_width/2, new_records, bar_width, 
                label='新纪录', color=bar_colors, edgecolor='black')

# 添加数值标签
for i, (old, new, imp) in enumerate(zip(old_records, new_records, improvements)):
    ax1.text(i - bar_width/2, old + max(new_records)*0.01, f'{data[i][4]}', 
             ha='center', va='bottom', fontsize=9, rotation=45)
    ax1.text(i + bar_width/2, new + max(new_records)*0.01, f'{data[i][3]}', 
             ha='center', va='bottom', fontsize=9, rotation=45, fontweight='bold')
    
    # 添加突破箭头
    ax1.annotate('', xy=(i, new), xytext=(i, old),
                arrowprops=dict(arrowstyle='->', color='red', lw=1.5))

# 设置主图属性
ax1.set_xlabel('比赛项目', fontsize=12)
ax1.set_ylabel('成绩 (秒)', fontsize=12)
ax1.set_title('新旧世界纪录对比', fontsize=14, fontweight='bold')
ax1.set_xticks(x_pos)
ax1.set_xticklabels([f"{date}\n{event}" for date, event in zip(dates, events)], 
                   rotation=45, ha='right', fontsize=10)
ax1.legend()
ax1.grid(True, alpha=0.3)

# 副图:突破幅度展示
bars3 = ax2.bar(x_pos, improvements, color=bar_colors, edgecolor='black')
ax2.axhline(y=0, color='black', linestyle='-', alpha=0.3)

# 添加突破幅度数值标签
for i, (bar, imp) in enumerate(zip(bars3, improvements)):
    height = bar.get_height()
    ax2.text(bar.get_x() + bar.get_width()/2., height + (0.01 if height > 0 else -0.03),
             f'{imp:.2f}秒', ha='center', va='bottom' if height > 0 else 'top', 
             fontsize=10, fontweight='bold')

# 设置副图属性
ax2.set_xlabel('比赛项目', fontsize=12)
ax2.set_ylabel('突破幅度 (秒)', fontsize=12)
ax2.set_title('纪录突破幅度', fontsize=14, fontweight='bold')
ax2.set_xticks(x_pos)
ax2.set_xticklabels([f"{date}\n{event}" for date, event in zip(dates, events)], 
                   rotation=45, ha='right', fontsize=10)
ax2.grid(True, alpha=0.3)

# 添加运动员信息标注
for i, athlete in enumerate(athletes):
    ax1.text(i, -max(new_records)*0.1, athlete, 
            ha='center', va='top', fontsize=9, rotation=45, 
            bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.7))

# 创建图例
legend_elements = [Patch(facecolor=colors['中国'], label='中国'),
                  Patch(facecolor=colors['西班牙'], label='西班牙'),
                  Patch(facecolor=colors['墨西哥'], label='墨西哥')]
ax1.legend(handles=legend_elements, loc='upper right')

# 添加统计信息
total_improvement = sum(improvements)
avg_improvement = total_improvement / len(improvements)
china_count = countries.count("中国")

stats_text = f'总突破幅度: {total_improvement:.2f}秒 | 平均突破: {avg_improvement:.2f}秒 | 中国破纪录: {china_count}次'
fig.text(0.5, 0.02, stats_text, ha='center', fontsize=12, 
        bbox=dict(boxstyle="round,pad=0.5", facecolor="lightblue", alpha=0.7))

# 调整布局
plt.tight_layout()
plt.subplots_adjust(top=0.9, bottom=0.15)

# 保存图片
# plt.savefig('chengdu_world_records_summary.png', dpi=300, bbox_inches='tight')
plt.show()

图8:成都世运会破纪录时刻
在这里插入图片描述

破纪录项目分布分析

  1. 攀岩项目:中国队在速度接力中4次刷新世界纪录,展现绝对统治力
  2. 新兴项目:轮滑、蹼泳等非奥项目产生多项新纪录
  3. 冷门突破:墨西哥选手在铁人两项创造赛事最小夺冠优势纪录(0.02秒)

3D奖牌分布图

from pyecharts.charts import Bar3D

countries = ["中国", "美国"]
medal_types = ["金牌", "银牌", "铜牌"]
data = [
    [0, 0, 36], [0, 1, 17], [0, 2, 11],  # 中国
    [1, 0, 28], [1, 1, 22], [1, 2, 18],  # 美国
    # 其他国家...
]

bar3d = (
    Bar3D()
    .add(
        "",
        data,
        xaxis3d_opts=opts.Axis3DOpts(countries, type_="category"),
        yaxis3d_opts=opts.Axis3DOpts(medal_types, type_="category"),
        zaxis3d_opts=opts.Axis3DOpts(type_="value"),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="奖牌3D分布图"),
        visualmap_opts=opts.VisualMapOpts(max_=40)
    )
)
bar3d.render("3d_medal_distribution.html")

图9:奖牌3D分布图
在这里插入图片描述

结论与展望

通过Python数据可视化,我们能够清晰地看到中国代表团在2025成都世运会上的卓越表现:36枚金牌、17枚银牌和11枚铜牌的辉煌战绩,以及创下的多项世界纪录。

同时,武术和龙舟等中国传统体育项目的正式亮相和国际化发展,展示了中国文化软实力的提升。

–斑点鱼要成为伟大的数据分析师
在这里插入图片描述

Logo

欢迎大家加入成都城市开发者社区,“和我在成都的街头走一走”,让我们一起携手,汇聚IT技术潮流,共建社区文明生态!

更多推荐