• 120年奥运历史数据分析


    目录

    一、数据概览

    1.背景描述

    2.数据说明

    3.属性描述

    4.数据来源

    二、数据集可探索、研究的方向

    三、可视化分析

    1.🏆各国累计奖牌数

    ​编辑

    2.⚽️各项运动产生金牌数

    3.⛳️运动员层面

    ①参赛人数趋势

     ②女性参赛比例趋势

    ③获得金牌最多的运动员

    ④获得奖牌/金牌比例

    ⑤各项目运动员平均体质数据

    4.中国表现

    ①中国历届奥运会参赛人数

    ②中国历届奥运会奖牌数

    ③中国优势项目

    5.💥被单个国家统治的奥运会项目


    一、数据概览

    1.背景描述

    该数据集整理了从1896年雅典奥运会至2016年里约热内卢奥运会120年的奥林匹克运动会的历史数据。

    需要注意的是,在1896年-1992年期间,冬季奥运会与夏季奥运会都是在同一年举行的。在这之后,冬季与夏季的奥运会才被错开举办,冬季奥运会从1994年开始4年举办一次,夏季奥运会从1996开始4年举办一次。大家在分析这些数据时,经常会犯得一个错误就是认为夏季与冬季奥运会是一直错开举办的。

    • 受疫情影响,2020东京奥运会将延期至2021年举行;

    • 虽然延期,但此次奥运会依旧会沿用「2020东京奥运会」这个名称;

    • 这也将是奥运会历史上首次延期(1916年、1940年、1944年曾因一战,二战停办);

    2.数据说明

    • 文件列表 该数据集包含两个文件:

    3.属性描述

    文件athlete_events.csv中包含15个字段,具体信息如下:

    每一行代表的是一个参加个人比赛运动员

    No属性数据类型字段描述
    1IDInteger给每个运动员的唯一ID
    2NameString运动员名字
    3SexInteger性别
    4AgeFloat年龄
    5HeightFloat身高
    6WeightFloat体重
    7TeamString所代表的国家队
    8NOCString国家奥委会3个字母的代码
    9GamesString年份与季节
    10YearInteger比赛年份
    11SeasonString比赛季节
    12CityString举办城市
    13SportString运动类别
    14EventString比赛项目
    15MedalSring奖牌

    文件noc_regions.csv中包含3个字段,具体信息如下:

    No属性数据类型字段描述
    1NOCString国家奥委会3个字母的代码
    2RegionString国家
    3NotesString地区

    4.数据来源

    数据集源自于kaggle平台用户分享,基于证书 CC0: Public Domain 发布,具体信息内容源自Sports Reference

    二、数据集可探索、研究的方向

    可以从以下几个方面来探索奥林匹克运动会的演变历程:

    • 历年来 男女参赛运动员的表现如何?

    • 那不同地区?

    • 不同运动项目?

    • 不同比赛项目?

    三、可视化分析

    1.🏆各国累计奖牌数

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. def medal_stat(year, season='Summer'):
    14. t_data = medal_data[(medal_data['Year'] <= year) & (medal_data['Season'] == season)]
    15. t_data = t_data.groupby(['region', 'Medal'])['Nums'].sum().reset_index()
    16. t_data = t_data.set_index(['region', 'Medal']).unstack().reset_index().fillna(0, inplace=False)
    17. t_data = sorted(
    18. [(row['region'][0], int(row['Nums']['Gold']), int(row['Nums']['Silver']), int(row['Nums']['Bronze']))
    19. for _, row in t_data.iterrows()], key=lambda x: x[1] + x[2] + x[3], reverse=True)[:20]
    20. return t_data
    21. year_list = sorted(list(set(medal_data['Year'].to_list())), reverse=True)
    22. tl = Timeline(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))
    23. tl.add_schema(is_timeline_show=True, is_rewind_play=True, is_inverse=False,
    24. label_opts=opts.LabelOpts(is_show=False))
    25. for year in year_list:
    26. t_data = medal_stat(year)[::-1]
    27. bar = (
    28. Bar(init_opts=opts.InitOpts())
    29. .add_xaxis([x[0] for x in t_data])
    30. .add_yaxis("铜牌🥉", [x[3] for x in t_data],
    31. stack='stack1',
    32. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(218,165,32)'))
    33. .add_yaxis("银牌🥈", [x[2] for x in t_data],
    34. stack='stack1',
    35. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(192,192,192)'))
    36. .add_yaxis("金牌🏅️", [x[1] for x in t_data],
    37. stack='stack1',
    38. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(255,215,0)'))
    39. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    40. position='insideRight',
    41. font_style='italic'), )
    42. .set_global_opts(
    43. title_opts=opts.TitleOpts(title="各国累计奖牌数(夏季奥运会)"),
    44. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    45. legend_opts=opts.LegendOpts(is_show=True),
    46. graphic_opts=[opts.GraphicGroup(graphic_item=opts.GraphicItem(
    47. rotation=JsCode("Math.PI / 4"),
    48. bounding="raw",
    49. right=110,
    50. bottom=110,
    51. z=100),
    52. children=[
    53. opts.GraphicRect(
    54. graphic_item=opts.GraphicItem(
    55. left="center", top="center", z=100
    56. ),
    57. graphic_shape_opts=opts.GraphicShapeOpts(
    58. width=400, height=50
    59. ),
    60. graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
    61. fill="rgba(0,0,0,0.3)"
    62. ),
    63. ),
    64. opts.GraphicText(
    65. graphic_item=opts.GraphicItem(
    66. left="center", top="center", z=100
    67. ),
    68. graphic_textstyle_opts=opts.GraphicTextStyleOpts(
    69. text=year,
    70. font="bold 26px Microsoft YaHei",
    71. graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
    72. fill="#fff"
    73. ),
    74. ),
    75. ),
    76. ],
    77. )
    78. ], )
    79. .reversal_axis())
    80. tl.add(bar, year)
    81. tl.render(r".\htmlRender\01_各国累计奖牌数(夏季奥运会).html")

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. def medal_stat(year, season='Summer'):
    14. t_data = medal_data[(medal_data['Year'] <= year) & (medal_data['Season'] == season)]
    15. t_data = t_data.groupby(['region', 'Medal'])['Nums'].sum().reset_index()
    16. t_data = t_data.set_index(['region', 'Medal']).unstack().reset_index().fillna(0, inplace=False)
    17. t_data = sorted(
    18. [(row['region'][0], int(row['Nums']['Gold']), int(row['Nums']['Silver']), int(row['Nums']['Bronze']))
    19. for _, row in t_data.iterrows()], key=lambda x: x[1] + x[2] + x[3], reverse=True)[:20]
    20. return t_data
    21. year_list = sorted(list(set(medal_data['Year'].to_list())), reverse=True)
    22. tl = Timeline(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))
    23. tl.add_schema(is_timeline_show=True, is_rewind_play=True, is_inverse=False,
    24. label_opts=opts.LabelOpts(is_show=False))
    25. year_list = sorted(list(set(medal_data['Year'][medal_data.Season == 'Winter'].to_list())), reverse=True)
    26. tl = Timeline(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))
    27. tl.add_schema(is_timeline_show=True, is_rewind_play=True, is_inverse=False,
    28. label_opts=opts.LabelOpts(is_show=False))
    29. for year in year_list:
    30. t_data = medal_stat(year, 'Winter')[::-1]
    31. bar = (
    32. Bar(init_opts=opts.InitOpts(theme='dark'))
    33. .add_xaxis([x[0] for x in t_data])
    34. .add_yaxis("铜牌🥉", [x[3] for x in t_data],
    35. stack='stack1',
    36. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(218,165,32)'))
    37. .add_yaxis("银牌🥈", [x[2] for x in t_data],
    38. stack='stack1',
    39. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(192,192,192)'))
    40. .add_yaxis("金牌🏅️", [x[1] for x in t_data],
    41. stack='stack1',
    42. itemstyle_opts=opts.ItemStyleOpts(border_color='rgb(220,220,220)', color='rgb(255,215,0)'))
    43. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    44. position='insideRight',
    45. font_style='italic'), )
    46. .set_global_opts(
    47. title_opts=opts.TitleOpts(title="各国累计奖牌数(冬季奥运会)"),
    48. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    49. legend_opts=opts.LegendOpts(is_show=True),
    50. graphic_opts=[opts.GraphicGroup(graphic_item=opts.GraphicItem(
    51. rotation=JsCode("Math.PI / 4"),
    52. bounding="raw",
    53. right=110,
    54. bottom=110,
    55. z=100),
    56. children=[
    57. opts.GraphicRect(
    58. graphic_item=opts.GraphicItem(
    59. left="center", top="center", z=100
    60. ),
    61. graphic_shape_opts=opts.GraphicShapeOpts(
    62. width=400, height=50
    63. ),
    64. graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
    65. fill="rgba(0,0,0,0.3)"
    66. ),
    67. ),
    68. opts.GraphicText(
    69. graphic_item=opts.GraphicItem(
    70. left="center", top="center", z=100
    71. ),
    72. graphic_textstyle_opts=opts.GraphicTextStyleOpts(
    73. text='截止{}'.format(year),
    74. font="bold 26px Microsoft YaHei",
    75. graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
    76. fill="#fff"
    77. ),
    78. ),
    79. ),
    80. ],
    81. )
    82. ], )
    83. .reversal_axis())
    84. tl.add(bar, year)
    85. tl.render(r".\htmlRender\02_各国累计奖牌数(冬季奥运会).html")

    2.⚽️各项运动产生金牌数

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. background_color_js = """new echarts.graphic.RadialGradient(0.5, 0.5, 1, [{
    14. offset: 0,
    15. color: '#696969'
    16. }, {
    17. offset: 1,
    18. color: '#000000'
    19. }])"""
    20. tab = Tab()
    21. temp = data[(data['Medal'] == 'Gold') & (data['Year'] == 2016) & (data['Season'] == 'Summer')]
    22. event_medal = temp.groupby(['Sport'])['Event'].nunique().reset_index()
    23. event_medal.columns = ['Sport', 'Nums']
    24. event_medal = event_medal.sort_values(by="Nums", ascending=False)
    25. pie = (Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='800px'))
    26. .add('金牌🏅️', [(row['Sport'], row['Nums']) for _, row in event_medal.iterrows()],
    27. radius=["30%", "75%"],
    28. rosetype="radius")
    29. .set_global_opts(title_opts=opts.TitleOpts(title="2016年夏季奥运会各项运动产生金牌占比",
    30. pos_left="center",
    31. title_textstyle_opts=opts.TextStyleOpts(color="white",
    32. font_size=20), ),
    33. legend_opts=opts.LegendOpts(is_show=False))
    34. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"),
    35. tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a}
      {b}: {c} ({d}%)"
      ), )
    36. )
    37. tab.add(pie, '2016年夏奥会')
    38. temp = data[(data['Medal'] == 'Gold') & (data['Year'] == 2014) & (data['Season'] == 'Winter')]
    39. event_medal = temp.groupby(['Sport'])['Event'].nunique().reset_index()
    40. event_medal.columns = ['Sport', 'Nums']
    41. event_medal = event_medal.sort_values(by="Nums", ascending=False)
    42. pie = (Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='800px'))
    43. .add('金牌🏅️', [(row['Sport'], row['Nums']) for _, row in event_medal.iterrows()],
    44. radius=["30%", "75%"],
    45. rosetype="radius")
    46. .set_global_opts(title_opts=opts.TitleOpts(title="2014年冬季奥运会各项运动产生金牌占比",
    47. pos_left="center",
    48. title_textstyle_opts=opts.TextStyleOpts(color="white",
    49. font_size=20), ),
    50. legend_opts=opts.LegendOpts(is_show=False))
    51. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"),
    52. tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a}
      {b}: {c} ({d}%)"
    53. ), )
    54. )
    55. tab.add(pie, '2014年冬奥会')
    56. tab.render(r".\htmlRender\03_2016夏2014年冬奥会各项运动金牌数.html")

    3.⛳️运动员层面

    ①参赛人数趋势

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. athlete = data.groupby(['Year', 'Season'])['Name'].nunique().reset_index()
    14. athlete.columns = ['Year', 'Season', 'Nums']
    15. athlete = athlete.sort_values(by="Year", ascending=True)
    16. x_list, y1_list, y2_list = [], [], []
    17. for _, row in athlete.iterrows():
    18. x_list.append(str(row['Year']))
    19. if row['Season'] == 'Summer':
    20. y1_list.append(row['Nums'])
    21. y2_list.append(None)
    22. else:
    23. y2_list.append(row['Nums'])
    24. y1_list.append(None)
    25. background_color_js = (
    26. "new echarts.graphic.LinearGradient(1, 1, 0, 0, "
    27. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    28. )
    29. line = (
    30. Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))
    31. .add_xaxis(x_list)
    32. .add_yaxis("夏季奥运会",
    33. y1_list,
    34. is_smooth=True,
    35. is_connect_nones=True,
    36. symbol="circle",
    37. symbol_size=6,
    38. linestyle_opts=opts.LineStyleOpts(color="#fff"),
    39. label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),
    40. itemstyle_opts=opts.ItemStyleOpts(
    41. color="green", border_color="#fff", border_width=3),
    42. tooltip_opts=opts.TooltipOpts(is_show=True))
    43. .add_yaxis("冬季季奥运会",
    44. y2_list,
    45. is_smooth=True,
    46. is_connect_nones=True,
    47. symbol="circle",
    48. symbol_size=6,
    49. linestyle_opts=opts.LineStyleOpts(color="#FF4500"),
    50. label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),
    51. itemstyle_opts=opts.ItemStyleOpts(
    52. color="red", border_color="#fff", border_width=3),
    53. tooltip_opts=opts.TooltipOpts(is_show=True))
    54. .set_series_opts(
    55. markarea_opts=opts.MarkAreaOpts(
    56. label_opts=opts.LabelOpts(is_show=True, position="bottom", color="white"),
    57. data=[
    58. opts.MarkAreaItem(name="第一次世界大战", x=(1914, 1918)),
    59. opts.MarkAreaItem(name="第二次世界大战", x=(1939, 1945)),
    60. ]
    61. )
    62. )
    63. .set_global_opts(title_opts=opts.TitleOpts(title="历届奥运会参赛人数",
    64. pos_left="center",
    65. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20), ),
    66. legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',
    67. textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),
    68. xaxis_opts=opts.AxisOpts(type_="value",
    69. min_=1904,
    70. max_=2016,
    71. boundary_gap=False,
    72. axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",
    73. formatter=JsCode("""function (value)
    74. {return value+'年';}""")),
    75. axisline_opts=opts.AxisLineOpts(is_show=False),
    76. axistick_opts=opts.AxisTickOpts(
    77. is_show=True,
    78. length=25,
    79. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
    80. ),
    81. splitline_opts=opts.SplitLineOpts(
    82. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    83. ),
    84. ),
    85. yaxis_opts=opts.AxisOpts(
    86. type_="value",
    87. position="right",
    88. axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"),
    89. axisline_opts=opts.AxisLineOpts(
    90. linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
    91. ),
    92. axistick_opts=opts.AxisTickOpts(
    93. is_show=True,
    94. length=15,
    95. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
    96. ),
    97. splitline_opts=opts.SplitLineOpts(
    98. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    99. ),
    100. ), )
    101. )
    102. line.render(r".\htmlRender\04_历届奥运会参赛人数.html")

     ②女性参赛比例趋势

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. # 历年男性运动员人数
    14. m_data = data[data.Sex == 'M'].groupby(['Year', 'Season'])['Name'].nunique().reset_index()
    15. m_data.columns = ['Year', 'Season', 'M-Nums']
    16. m_data = m_data.sort_values(by="Year", ascending=True)
    17. # 历年女性运动员人数
    18. f_data = data[data.Sex == 'F'].groupby(['Year', 'Season'])['Name'].nunique().reset_index()
    19. f_data.columns = ['Year', 'Season', 'F-Nums']
    20. f_data = f_data.sort_values(by="Year", ascending=True)
    21. t_data = pd.merge(m_data, f_data, on=['Year', 'Season'])
    22. t_data['F-rate'] = round(t_data['F-Nums'] / (t_data['F-Nums'] + t_data['M-Nums']), 4)
    23. x_list, y1_list, y2_list = [], [], []
    24. for _, row in t_data.iterrows():
    25. x_list.append(str(row['Year']))
    26. if row['Season'] == 'Summer':
    27. y1_list.append(row['F-rate'])
    28. y2_list.append(None)
    29. else:
    30. y2_list.append(row['F-rate'])
    31. y1_list.append(None)
    32. background_color_js = (
    33. "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
    34. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    35. )
    36. line = (
    37. Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))
    38. .add_xaxis(x_list)
    39. .add_yaxis("夏季奥运会",
    40. y1_list,
    41. is_smooth=True,
    42. is_connect_nones=True,
    43. symbol="circle",
    44. symbol_size=6,
    45. linestyle_opts=opts.LineStyleOpts(color="#fff"),
    46. label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),
    47. itemstyle_opts=opts.ItemStyleOpts(color="green", border_color="#fff", border_width=3),
    48. tooltip_opts=opts.TooltipOpts(is_show=True), )
    49. .add_yaxis("冬季季奥运会",
    50. y2_list,
    51. is_smooth=True,
    52. is_connect_nones=True,
    53. symbol="circle",
    54. symbol_size=6,
    55. linestyle_opts=opts.LineStyleOpts(color="#FF4500"),
    56. label_opts=opts.LabelOpts(is_show=False, position="top", color="white"),
    57. itemstyle_opts=opts.ItemStyleOpts(color="red", border_color="#fff", border_width=3),
    58. tooltip_opts=opts.TooltipOpts(is_show=True), )
    59. .set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter=JsCode("""function (params)
    60. {return params.data[0]+ '年: ' + Number(params.data[1])*100 +'%';}""")), )
    61. .set_global_opts(title_opts=opts.TitleOpts(title="历届奥运会参赛女性占比趋势",
    62. pos_left="center",
    63. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20), ),
    64. legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',
    65. textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),
    66. xaxis_opts=opts.AxisOpts(type_="value",
    67. min_=1904,
    68. max_=2016,
    69. boundary_gap=False,
    70. axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63",
    71. formatter=JsCode("""function (value)
    72. {return value+'年';}""")),
    73. axisline_opts=opts.AxisLineOpts(is_show=False),
    74. axistick_opts=opts.AxisTickOpts(
    75. is_show=True,
    76. length=25,
    77. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
    78. ),
    79. splitline_opts=opts.SplitLineOpts(
    80. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    81. ),
    82. ),
    83. yaxis_opts=opts.AxisOpts(
    84. type_="value",
    85. position="right",
    86. axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63",
    87. formatter=JsCode("""function (value)
    88. {return Number(value *100)+'%';}""")),
    89. axisline_opts=opts.AxisLineOpts(
    90. linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")
    91. ),
    92. axistick_opts=opts.AxisTickOpts(
    93. is_show=True,
    94. length=15,
    95. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"),
    96. ),
    97. splitline_opts=opts.SplitLineOpts(
    98. is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    99. ),
    100. ), )
    101. )
    102. line.render(r".\htmlRender\05_历届奥运会参赛女性占比趋势.html")

    ③获得金牌最多的运动员

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. temp = data[(data['Medal'] == 'Gold')]
    14. athlete = temp.groupby(['Name'])['Medal'].count().reset_index()
    15. athlete.columns = ['Name', 'Nums']
    16. athlete = athlete.sort_values(by="Nums", ascending=True)
    17. background_color_js = (
    18. "new echarts.graphic.LinearGradient(0, 0, 1, 1, "
    19. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    20. )
    21. pb = (
    22. PictorialBar(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='800px'))
    23. .add_xaxis([x.replace(' ', '\n') for x in athlete['Name'].tail(10).tolist()])
    24. .add_yaxis(
    25. "",
    26. athlete['Nums'].tail(10).tolist(),
    27. label_opts=opts.LabelOpts(is_show=False),
    28. symbol_size=25,
    29. symbol_repeat='fixed',
    30. symbol_offset=[0, 0],
    31. is_symbol_clip=True,
    32. symbol='image://https://cdn.kesci.com/upload/image/q8f8otrlfc.png')
    33. .reversal_axis()
    34. .set_global_opts(
    35. title_opts=opts.TitleOpts(title="获得金牌数量最多的运动员", pos_left='center',
    36. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20), ),
    37. xaxis_opts=opts.AxisOpts(is_show=False, ),
    38. yaxis_opts=opts.AxisOpts(
    39. axistick_opts=opts.AxisTickOpts(is_show=False),
    40. axisline_opts=opts.AxisLineOpts(
    41. linestyle_opts=opts.LineStyleOpts(opacity=0)
    42. ),
    43. ),
    44. ))
    45. pb.render(r".\htmlRender\06_获得金牌数量最多的运动员.html")

    ④获得奖牌/金牌比例

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. total_athlete = len(set(data['Name']))
    14. medal_athlete = len(set(data['Name'][data['Medal'].isin(['Gold', 'Silver', 'Bronze'])]))
    15. gold_athlete = len(set(data['Name'][data['Medal'] == 'Gold']))
    16. l1 = Liquid(init_opts=opts.InitOpts(theme='dark', width='1000px', height='800px'))
    17. l1.add("获得奖牌", [medal_athlete / total_athlete],
    18. center=["70%", "50%"],
    19. label_opts=opts.LabelOpts(font_size=50,
    20. formatter=JsCode(
    21. """function (param) {
    22. return (Math.floor(param.value * 10000) / 100) + '%';
    23. }"""),
    24. position="inside",
    25. ))
    26. l1.set_global_opts(title_opts=opts.TitleOpts(title="获得过奖牌比例", pos_left='62%', pos_top='8%'))
    27. l1.set_series_opts(tooltip_opts=opts.TooltipOpts(is_show=False))
    28. l2 = Liquid(init_opts=opts.InitOpts(theme='dark', width='1000px', height='800px'))
    29. l2.add("获得金牌",
    30. [gold_athlete / total_athlete],
    31. center=["25%", "50%"],
    32. label_opts=opts.LabelOpts(font_size=50,
    33. formatter=JsCode(
    34. """function (param) {
    35. return (Math.floor(param.value * 10000) / 100) + '%';
    36. }"""),
    37. position="inside",
    38. ), )
    39. l2.set_global_opts(title_opts=opts.TitleOpts(title="获得过金牌比例", pos_left='17%', pos_top='8%'))
    40. l2.set_series_opts(tooltip_opts=opts.TooltipOpts(is_show=False))
    41. grid = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts())
    42. grid.render(r".\htmlRender\07_获得金牌奖牌比例.html")

    ⑤各项目运动员平均体质数据

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. tool_js = """function (param) {return param.data[2] +'
      '
    14. +'平均体重: '+Number(param.data[0]).toFixed(2)+' kg
      '
    15. +'平均身高: '+Number(param.data[1]).toFixed(2)+' cm
      '
    16. +'平均年龄: '+Number(param.data[3]).toFixed(2);}"""
    17. background_color_js = (
    18. "new echarts.graphic.LinearGradient(1, 0, 0, 1, "
    19. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    20. )
    21. temp_data = data[data['Sex'] == 'M'].groupby(['Sport'])[['Age', 'Height', 'Weight']].mean().reset_index().dropna(
    22. how='any')
    23. scatter = (Scatter(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))
    24. .add_xaxis(temp_data['Weight'].tolist())
    25. .add_yaxis("男性", [[row['Height'], row['Sport'], row['Age']] for _, row in temp_data.iterrows()],
    26. # 渐变效果实现部分
    27. color=JsCode("""new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
    28. offset: 0,
    29. color: 'rgb(129, 227, 238)'
    30. }, {
    31. offset: 1,
    32. color: 'rgb(25, 183, 207)'
    33. }])"""))
    34. .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    35. .set_global_opts(
    36. title_opts=opts.TitleOpts(title="各项目运动员平均升高体重年龄", pos_left="center",
    37. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)),
    38. legend_opts=opts.LegendOpts(is_show=True, pos_top='5%',
    39. textstyle_opts=opts.TextStyleOpts(color="white", font_size=12)),
    40. tooltip_opts=opts.TooltipOpts(formatter=JsCode(tool_js)),
    41. xaxis_opts=opts.AxisOpts(
    42. name='体重/kg',
    43. # 设置坐标轴为数值类型
    44. type_="value",
    45. is_scale=True,
    46. # 显示分割线
    47. axislabel_opts=opts.LabelOpts(margin=30, color="white"),
    48. axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),
    49. axistick_opts=opts.AxisTickOpts(is_show=True, length=25,
    50. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),
    51. splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    52. )),
    53. yaxis_opts=opts.AxisOpts(
    54. name='身高/cm',
    55. # 设置坐标轴为数值类型
    56. type_="value",
    57. # 默认为False表示起始为0
    58. is_scale=True,
    59. axislabel_opts=opts.LabelOpts(margin=30, color="white"),
    60. axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),
    61. axistick_opts=opts.AxisTickOpts(is_show=True, length=25,
    62. linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")),
    63. splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")
    64. )),
    65. visualmap_opts=opts.VisualMapOpts(is_show=False, type_='size', range_size=[5, 50], min_=10, max_=40)
    66. ))
    67. temp_data = data[data['Sex'] == 'F'].groupby(['Sport'])[['Age', 'Height', 'Weight']].mean().reset_index().dropna(
    68. how='any')
    69. scatter1 = (Scatter()
    70. .add_xaxis(temp_data['Weight'].tolist())
    71. .add_yaxis("女性", [[row['Height'], row['Sport'], row['Age']] for _, row in temp_data.iterrows()],
    72. itemstyle_opts=opts.ItemStyleOpts(
    73. color=JsCode("""new echarts.graphic.RadialGradient(0.4, 0.3, 1, [{
    74. offset: 0,
    75. color: 'rgb(251, 118, 123)'
    76. }, {
    77. offset: 1,
    78. color: 'rgb(204, 46, 72)'
    79. }])""")))
    80. .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    81. )
    82. scatter.overlap(scatter1)
    83. scatter.render(r".\htmlRender\08_运动员平均体质数据.html")

    4.中国表现

    ①中国历届奥运会参赛人数

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. CN_data = data[data.region == 'China']
    14. CN_data.head()
    15. background_color_js = (
    16. "new echarts.graphic.LinearGradient(1, 0, 0, 1, "
    17. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    18. )
    19. athlete = CN_data.groupby(['Year', 'Season'])['Name'].nunique().reset_index()
    20. athlete.columns = ['Year', 'Season', 'Nums']
    21. athlete = athlete.sort_values(by="Year", ascending=False)
    22. s_bar = (
    23. Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))
    24. .add_xaxis([row['Year'] for _, row in athlete[athlete.Season == 'Summer'].iterrows()])
    25. .add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season == 'Summer'].iterrows()],
    26. category_gap='40%',
    27. itemstyle_opts=opts.ItemStyleOpts(
    28. border_color='rgb(220,220,220)',
    29. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    30. [{
    31. offset: 1,
    32. color: '#00BFFF'
    33. }, {
    34. offset: 0,
    35. color: '#32CD32'
    36. }])""")))
    37. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    38. position='top',
    39. font_style='italic'))
    40. .set_global_opts(
    41. title_opts=opts.TitleOpts(title="中国历年奥运会参赛人数-夏奥会", pos_left='center'),
    42. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    43. legend_opts=opts.LegendOpts(is_show=False),
    44. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),
    45. graphic_opts=[
    46. opts.GraphicImage(
    47. graphic_item=opts.GraphicItem(
    48. id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]
    49. ),
    50. graphic_imagestyle_opts=opts.GraphicImageStyleOpts(
    51. image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",
    52. width=1000,
    53. height=600,
    54. opacity=0.6, ),
    55. )
    56. ], )
    57. )
    58. w_bar = (
    59. Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))
    60. .add_xaxis([row['Year'] for _, row in athlete[athlete.Season == 'Winter'].iterrows()])
    61. .add_yaxis("参赛人数", [row['Nums'] for _, row in athlete[athlete.Season == 'Winter'].iterrows()],
    62. category_gap='50%',
    63. itemstyle_opts=opts.ItemStyleOpts(
    64. border_color='rgb(220,220,220)',
    65. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    66. [{
    67. offset: 1,
    68. color: '#00BFFF'
    69. }, {
    70. offset: 0.8,
    71. color: '#FFC0CB'
    72. }, {
    73. offset: 0,
    74. color: '#40E0D0'
    75. }])""")))
    76. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    77. position='top',
    78. font_style='italic'))
    79. .set_global_opts(
    80. title_opts=opts.TitleOpts(title="中国历年奥运会参赛人数-冬奥会", pos_left='center'),
    81. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    82. legend_opts=opts.LegendOpts(is_show=False),
    83. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),
    84. graphic_opts=[
    85. opts.GraphicImage(
    86. graphic_item=opts.GraphicItem(
    87. id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]
    88. ),
    89. graphic_imagestyle_opts=opts.GraphicImageStyleOpts(
    90. image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",
    91. width=1000,
    92. height=600,
    93. opacity=0.6, ),
    94. )
    95. ], )
    96. )
    97. page = (
    98. Page()
    99. .add(s_bar, )
    100. .add(w_bar, )
    101. )
    102. page.render(r".\htmlRender\09_历届奥运会参赛人数.html")

    ②中国历届奥运会奖牌数

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. CN_data = data[data.region == 'China']
    14. CN_data.head()
    15. background_color_js = (
    16. "new echarts.graphic.LinearGradient(1, 0, 0, 1, "
    17. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    18. )
    19. CN_medals = CN_data.groupby(['Year', 'Season', 'Medal'])['Event'].nunique().reset_index()
    20. CN_medals.columns = ['Year', 'Season', 'Medal', 'Nums']
    21. CN_medals = CN_medals.sort_values(by="Year", ascending=False)
    22. s_bar = (
    23. Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))
    24. .add_xaxis(
    25. sorted(list(set([row['Year'] for _, row in CN_medals[CN_medals.Season == 'Summer'].iterrows()])), reverse=True))
    26. .add_yaxis("金牌", [row['Nums'] for _, row in
    27. CN_medals[(CN_medals.Season == 'Summer') & (CN_medals.Medal == 'Gold')].iterrows()],
    28. category_gap='20%',
    29. itemstyle_opts=opts.ItemStyleOpts(
    30. border_color='rgb(220,220,220)',
    31. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    32. [{
    33. offset: 0,
    34. color: '#FFD700'
    35. }, {
    36. offset: 1,
    37. color: '#FFFFF0'
    38. }])""")))
    39. .add_yaxis("银牌", [row['Nums'] for _, row in
    40. CN_medals[(CN_medals.Season == 'Summer') & (CN_medals.Medal == 'Silver')].iterrows()],
    41. category_gap='20%',
    42. itemstyle_opts=opts.ItemStyleOpts(
    43. border_color='rgb(220,220,220)',
    44. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    45. [{
    46. offset: 0,
    47. color: '#C0C0C0'
    48. }, {
    49. offset: 1,
    50. color: '#FFFFF0'
    51. }])""")))
    52. .add_yaxis("铜牌", [row['Nums'] for _, row in
    53. CN_medals[(CN_medals.Season == 'Summer') & (CN_medals.Medal == 'Bronze')].iterrows()],
    54. category_gap='20%',
    55. itemstyle_opts=opts.ItemStyleOpts(
    56. border_color='rgb(220,220,220)',
    57. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    58. [{
    59. offset: 0,
    60. color: '#DAA520'
    61. }, {
    62. offset: 1,
    63. color: '#FFFFF0'
    64. }])""")))
    65. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    66. position='top',
    67. font_style='italic'))
    68. .set_global_opts(
    69. title_opts=opts.TitleOpts(title="中国历年奥运会获得奖牌数数-夏奥会", pos_left='center'),
    70. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    71. legend_opts=opts.LegendOpts(is_show=False),
    72. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),
    73. graphic_opts=[
    74. opts.GraphicImage(
    75. graphic_item=opts.GraphicItem(
    76. id_="logo", right=0, top=0, z=-10, bounding="raw", origin=[75, 75]
    77. ),
    78. graphic_imagestyle_opts=opts.GraphicImageStyleOpts(
    79. image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",
    80. width=1000,
    81. height=600,
    82. opacity=0.6, ),
    83. )
    84. ], )
    85. )
    86. w_bar = (
    87. Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='300px'))
    88. .add_xaxis(
    89. sorted(list(set([row['Year'] for _, row in CN_medals[CN_medals.Season == 'Winter'].iterrows()])), reverse=True))
    90. .add_yaxis("金牌", [row['Nums'] for _, row in
    91. CN_medals[(CN_medals.Season == 'Winter') & (CN_medals.Medal == 'Gold')].iterrows()],
    92. category_gap='20%',
    93. itemstyle_opts=opts.ItemStyleOpts(
    94. border_color='rgb(220,220,220)',
    95. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    96. [{
    97. offset: 0,
    98. color: '#FFD700'
    99. }, {
    100. offset: 1,
    101. color: '#FFFFF0'
    102. }])""")))
    103. .add_yaxis("银牌", [row['Nums'] for _, row in
    104. CN_medals[(CN_medals.Season == 'Winter') & (CN_medals.Medal == 'Silver')].iterrows()],
    105. category_gap='20%',
    106. itemstyle_opts=opts.ItemStyleOpts(
    107. border_color='rgb(220,220,220)',
    108. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    109. [{
    110. offset: 0,
    111. color: '#C0C0C0'
    112. }, {
    113. offset: 1,
    114. color: '#FFFFF0'
    115. }])""")))
    116. .add_yaxis("铜牌", [row['Nums'] for _, row in
    117. CN_medals[(CN_medals.Season == 'Winter') & (CN_medals.Medal == 'Bronze')].iterrows()],
    118. category_gap='20%',
    119. itemstyle_opts=opts.ItemStyleOpts(
    120. border_color='rgb(220,220,220)',
    121. color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1,
    122. [{
    123. offset: 0,
    124. color: '#DAA520'
    125. }, {
    126. offset: 1,
    127. color: '#FFFFF0'
    128. }])""")))
    129. .set_series_opts(label_opts=opts.LabelOpts(is_show=True,
    130. position='top',
    131. font_style='italic'))
    132. .set_global_opts(
    133. title_opts=opts.TitleOpts(title="中国历年奥运会获得奖牌数-冬奥会", pos_left='center'),
    134. xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)),
    135. legend_opts=opts.LegendOpts(is_show=False),
    136. yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63")),
    137. graphic_opts=[
    138. opts.GraphicImage(
    139. graphic_item=opts.GraphicItem(
    140. id_="logo", right=0, top=-300, z=-10, bounding="raw", origin=[75, 75]
    141. ),
    142. graphic_imagestyle_opts=opts.GraphicImageStyleOpts(
    143. image="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586619952245&di=981a36305048f93eec791980acc99cf7&imgtype=0&src=http%3A%2F%2Fimg5.mtime.cn%2Fmg%2F2017%2F01%2F06%2F172210.42721559.jpg",
    144. width=1000,
    145. height=600,
    146. opacity=0.6, ),
    147. )
    148. ], )
    149. )
    150. page = (
    151. Page()
    152. .add(s_bar, )
    153. .add(w_bar, )
    154. )
    155. page.render(r".\htmlRender\10_中国历届奥运会奖牌数.html")

    ③中国优势项目

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. CN_data = data[data.region == 'China']
    14. CN_data.head()
    15. background_color_js = (
    16. "new echarts.graphic.LinearGradient(1, 0, 0, 1, "
    17. "[{offset: 0.5, color: '#FFC0CB'}, {offset: 1, color: '#F0FFFF'}, {offset: 0, color: '#EE82EE'}], false)"
    18. )
    19. CN_events = CN_data[CN_data.Medal == 'Gold'].groupby(['Year', 'Sport'])['Event'].nunique().reset_index()
    20. CN_events = CN_events.groupby(['Sport'])['Event'].sum().reset_index()
    21. CN_events.columns = ['Sport', 'Nums']
    22. data_pair = [(row['Sport'], row['Nums']) for _, row in CN_events.iterrows()]
    23. wc = (WordCloud(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js), width='1000px', height='600px'))
    24. .add("", data_pair, word_size_range=[30, 80])
    25. .set_global_opts(title_opts=opts.TitleOpts(title="中国获得过金牌运动项目", pos_left="center",
    26. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)))
    27. )
    28. wc.render(r".\htmlRender\11_中国优势项目.html")

    5.💥被单个国家统治的奥运会项目

    1. import pandas as pd
    2. from pyecharts.charts import *
    3. from pyecharts import options as opts
    4. from pyecharts.commons.utils import JsCode
    5. athlete_data = pd.read_csv('./data/athlete_events.csv')
    6. noc_region = pd.read_csv('./data/noc_regions.csv')
    7. # 关联代表国家
    8. data = pd.merge(athlete_data, noc_region, on='NOC', how='left')
    9. print(data.head())
    10. medal_data = data.groupby(['Year', 'Season', 'region', 'Medal'])['Event'].nunique().reset_index()
    11. medal_data.columns = ['Year', 'Season', 'region', 'Medal', 'Nums']
    12. medal_data = medal_data.sort_values(by="Year", ascending=True)
    13. f1 = lambda x: max(x['Event']) / sum(x['Event'])
    14. f2 = lambda x: x.sort_values('Event', ascending=False).head(1)
    15. t_data = \
    16. data[(data.Medal == 'Gold') & (data.Year >= 2000) & (data.Season == 'Summer')].groupby(['Year', 'Sport', 'region'])[
    17. 'Event'].nunique().reset_index()
    18. t_data = t_data.groupby(['Sport', 'region'])['Event'].sum().reset_index()
    19. t1 = t_data.groupby(['Sport']).apply(f2).reset_index(drop=True)
    20. t2 = t_data.groupby(['Sport'])['Event'].sum().reset_index()
    21. t_data = pd.merge(t1, t2, on='Sport', how='inner')
    22. t_data['gold_rate'] = t_data.Event_x / t_data.Event_y
    23. t_data = t_data.sort_values('gold_rate', ascending=False).reset_index(drop=True)
    24. t_data = t_data[(t_data.gold_rate >= 0.5) & (t_data.Event_y >= 10)]
    25. background_color_js = (
    26. "new echarts.graphic.LinearGradient(1, 0, 0, 1, "
    27. "[{offset: 0, color: '#008B8B'}, {offset: 1, color: '#FF6347'}], false)"
    28. )
    29. fn = """
    30. function(params) {
    31. if(params.name == '其他国家')
    32. return '\\n\\n\\n' + params.name + ' : ' + params.value ;
    33. return params.seriesName+ '\\n' + params.name + ' : ' + params.value;
    34. }
    35. """
    36. def new_label_opts():
    37. return opts.LabelOpts(formatter=JsCode(fn), position="center")
    38. pie = Pie(init_opts=opts.InitOpts(theme='dark', width='1000px', height='1000px'))
    39. idx = 0
    40. for _, row in t_data.iterrows():
    41. if idx % 2 == 0:
    42. x = 30
    43. y = int(idx / 2) * 22 + 18
    44. else:
    45. x = 70
    46. y = int(idx / 2) * 22 + 18
    47. idx += 1
    48. pos_x = str(x) + '%'
    49. pos_y = str(y) + '%'
    50. pie.add(
    51. row['Sport'],
    52. [[row['region'], row['Event_x']], ['其他国家', row['Event_y'] - row['Event_x']]],
    53. center=[pos_x, pos_y],
    54. radius=[70, 100],
    55. label_opts=new_label_opts(), )
    56. pie.set_global_opts(
    57. title_opts=opts.TitleOpts(title="被单个国家统治的项目",
    58. subtitle='统计周期:2000年悉尼奥运会起',
    59. pos_left="center",
    60. title_textstyle_opts=opts.TextStyleOpts(color="white", font_size=20)),
    61. legend_opts=opts.LegendOpts(is_show=False),
    62. )
    63. pie.render(r".\htmlRender\12_被单个国家统治的奥运会项目.html")

      内容来自: 工作台 - Heywhale.com

     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓懒笑翻诚邀您点击下方群聊一起来学习讨论↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 相关阅读:
    分布式事务(Seata) 四大模式详解
    JAVA面试题总结基础篇(一)(附答案)
    智能生产线数字孪生有什么特点?AR智慧运维供应商首选广州华锐互动
    C语言学习概览(四)
    数字钥匙关键技术:UWB(超宽带)实现原理一文讲透
    叶酸FA修饰CdS/ZnS硫化镉/硫化锌量子点|氨基NH2修饰CdTe/ZnS碲化镉/硫化锌量子点
    javascript 记录
    Redis源码阅读02-数据结构sds
    整形数据和浮点型数据在内存中的存储差别
    谈一谈冷门的C语言爬虫
  • 原文地址:https://blog.csdn.net/c_lanxiaofang/article/details/126311987