中國奧運會成績,知道多少?13張圖告訴你

點擊上方“ Python爬蟲與數據挖掘 ”,進行關注

回覆“書籍”即可獲贈Python從入門到進階共10本電子書

水積而魚聚,木茂而鳥集。

大家好,我是Peter~

最近奧運會也是非常熱門的事件,但是針對本次奧運會有很多值得吐槽的地方,小島國的騷氣操作不想寫

於是Peter從網上收集的我國從1984年第一次參加夏季奧運會到2016年的歷屆奧運會獲獎情況,瞭解下歷屆的奧運會成績。

數據整理成寬表長表兩種形式,進行簡單的數據處理和不同方式的可視化圖形展示,方便大家瞭解我國的奧運會成績。

文中全程使用的繪圖工具是高級可視化庫:plotly

往期精選

本文使用的數據很簡單,但是涉及到了很多之前關於Plotly繪圖和Python的文章,推薦閱讀:

可視化神器Plotly玩轉子圖

55個案例:喫透Python字符串格式化

圖解Pandas的groupby機制

可視化神器Plotly玩轉直方圖

可視化神器Plotly玩轉氣泡圖

酷炫!高級可視化神器Plotly玩轉餅圖

圖形預覽

看看部分圖形效果展示:

導入庫

導入的庫主要是兩種:數據處理和繪圖相關

# 數據處理相關
import pandas as pd
import numpy as np

# 繪圖相關
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots  # 製作多子圖

兩種形式數據

從網上收集的中國隊歷屆夏季奧運會獲獎情況,整理成兩種形式:寬表和長表

1、寬表

寬表形式是將字段儘可能多羅列出來


2、長表

長表形式是將字段儘可能減少,同一個字段的數據信息可能出現重複


中國參加了多少屆夏季奧運會

主要講解的是Python中字符串格式化的知識點,3種不同的格式化展示方式:

  • 佔位符%s
  • format()
  • f-string

總獎牌數

展示的是中國曆屆奧運會的總獎牌數變化趨勢:

fig = px.line(df,x="地點",y="總數",text="總數")

fig.update_layout(title="中國獲得總獎牌數")

fig.show()

從結果的圖形中,我們看到2008年是最多的,剛好是100枚畢竟是家門口的比賽

fig = px.scatter(
    df,
    x="地點",
    y="總數",
    color="金牌",
    size="總數",
    text="總數"
    )

fig.show()

男子和女子金牌對比

從結果中我們可以看出來:

  • 1984年第一次參加奧運會,男子金牌數量是高於女子的
  • 此後,每屆都是女子高於男子:巾幗不讓鬚眉

多指標變化

fig = go.Figure()

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["總數"].tolist(),
    name="總數"
))

fig.add_trace(go.Bar(
    x=df["年份"].tolist(),
    y=df["金牌"].tolist(),
    name="金牌"
))

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["銀牌"].tolist(),
    name="銀牌"
))

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["銅牌"].tolist(),
    name="銅牌"
))

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["金牌榜"].tolist(),
    name="金牌榜"
))


fig.add_trace(go.Bar(
    x=df["年份"].tolist(),
    y=df["男子金牌"].tolist(),
    name="男子金牌"
))

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["女子金牌"].tolist(),
    name="女子金牌"
))

fig.show()

多指標變化

通過子圖的形式展示不同指標的變化趨勢:

# 兩個基本參數:設置行、列
fig = make_subplots(rows=4, cols=2,
                   subplot_titles=["獎牌總數","金牌","銀牌","銅牌","金牌榜","男子金牌","女子金牌","金牌佔比"]) 

# 添加數據軌跡
fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["總數"].tolist(),
    name="總數"
),1,1)

fig.add_trace(go.Bar(
    x=df["年份"].tolist(),
    y=df["金牌"].tolist(),
    name="金牌"
),1,2)

fig.add_trace(go.Bar(
    x=df["年份"].tolist(),
    y=df["銀牌"].tolist(),
    text=df["銀牌"].tolist(),
    textposition="outside",
    name="銀牌"
),2,1)

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["銅牌"].tolist(),
    name="銅牌"
),2,2)

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["金牌榜"].tolist(),
    mode="markers+text",
    text=df["金牌榜"].tolist(),
    textposition="bottom center",    # 位置
    name="金牌榜"
),3,1)


fig.add_trace(go.Bar(
    x=df["年份"].tolist(),
    y=df["男子金牌"].tolist(),
    name="男子金牌"
),3,2)

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["女子金牌"].tolist(),
    name="女子金牌"
),4,1)

fig.add_trace(go.Scatter(
    x=df["年份"].tolist(),
    y=df["金牌佔比"].tolist(),
    mode="lines+markers",
    text=df["金牌佔比"].tolist(),
    textposition="top center",
    name="金牌佔比"
),4,2)


# 設置圖形的寬高和標題
fig.update_layout(height=600
                  width=800
                  title_text="奧運會獎牌可視化")
fig.show()

雷達圖

雷達圖展示的是不同年份的獲獎情況

import plotly.graph_objects as go

categories = ['金牌','銀牌','銅牌']

fig = go.Figure()

fig.add_trace(go.Scatterpolar(
      r=df.iloc[0,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='洛杉磯-1984'
))
fig.add_trace(go.Scatterpolar(
      r=df.iloc[1,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='漢城-1988'
))

fig.add_trace(go.Scatterpolar(
      r=df.iloc[2,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='巴塞羅那-1992'
))
fig.add_trace(go.Scatterpolar(
      r=df.iloc[3,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='亞特蘭大-1996'
))

fig.add_trace(go.Scatterpolar(
      r=df.iloc[4,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='悉尼-2000'
))

fig.add_trace(go.Scatterpolar(
      r=df.iloc[5,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='雅典-2004'
))
fig.add_trace(go.Scatterpolar(
      r=df.iloc[6,2:5].tolist(),
      theta=categories,
      fill='tonext',   # ['none', 'toself', 'tonext']
      name='北京-2008'
))

fig.add_trace(go.Scatterpolar(
      r=df.iloc[7,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='倫敦-2012'
))
fig.add_trace(go.Scatterpolar(
      r=df.iloc[8,2:5].tolist(),
      theta=categories,
      fill='tonext',
      name='里約熱內盧-2016'
))

fig.update_layout(
  polar=dict(
    radialaxis=dict(
      visible=True,
      range=[054]
    )),
  showlegend=True
)

fig.show()

小結:從雷達圖的不同維度頂端觸角,就可以觀察到各自的最大值,比如金牌和銅牌最多的就是北京奧運會,銀牌最多的是倫敦奧運會

⚠️:上面的圖形都是基於寬表形式的數據,下面是基於長表形式

金銀銅牌對比

3種不同獎牌的地點(年份)對比情況:

px.bar(df2,
       x="地點",
       y="數量",
       color="獎牌",
       text="數量",
       barmode="group"
      )

多子圖-不同年份的3種獎牌數

# 不共享y軸

fig = px.scatter(
    df2,
    x="排名",
    y="數量",
    color="獎牌",
    size="數量",
    facet_col="年份",
    facet_col_wrap=3
)

#fig.update_yaxes(matches=None)  # 不共享y軸

fig.show()

圖形解釋:

  1. 橫座標:整體的排名。越靠左,數值越小,排名靠前。可以看到北京奧運會是最棒的:整體排名靠左
  2. 縱座標:每個獎牌的數量,氣泡越大,數量越多。銀牌是2012年倫敦,銅牌是2008年北京(看點的高度)

3種獎牌整體佔比

3種獎牌不同年份佔比

3種獎牌在不同屆奧運會的佔比情況:

# 兩個基本參數:設置行、列
fig = make_subplots(rows=3, cols=3,
                    horizontal_spacing=0.08,
                    vertical_spacing=0.1,
                    column_widths=[0.4,0.4,0.4],
                    specs=[[{"type":"domain"},{"type":"domain"},{"type":"domain"}],
                          [{"type":"domain"},{"type":"domain"},{"type":"domain"}],
                          [{"type":"domain"},{"type":"domain"},{"type":"domain"}]
                         ],
                   subplot_titles=["1984-洛杉磯","1988-漢城","1992-巴塞羅那","1996-亞特蘭大",
                                   "2000-悉尼","2004-雅典","2008-北京","2012-倫敦","2016-里約熱內盧"]) 

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][:3].tolist(),
    name="1984-洛杉磯"
),1,1)


fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][3:6].tolist(),
    name="1988-漢城"
),1,2)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][6:9].tolist(),
    name="1992-巴塞羅那"
),1,3)


fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][9:12].tolist(),
    name="1996-亞特蘭大"
),2,1)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][12:15].tolist(),
    name="2000-悉尼"
),2,2)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][15:18].tolist(),
    name="2004-雅典"
),2,3)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][18:21].tolist(),
    name="2008-北京"
),3,1)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][21:24].tolist(),
    name="2012-倫敦"
),3,2)

fig.add_trace(go.Pie(
    labels=df2["獎牌"][:3].tolist(),
    values=df2["數量"][24:27].tolist(),
    name="2016-里約熱內盧"
),3,3)


fig.update_traces(hole=0.2)

fig.show()

從圖形可以看出來:

  • 北京奧運會佔比最高:51%;其次是雅典奧運會
  • 1988年的漢城奧運會最低,才17.9%

3種獎牌旭日圖

px.sunburst(df2,path=["獎牌","地點"],
           values="數量",
           color="年份",
           color_continuous_scale="RdBu"
           )

根據3種獎牌的旭日圖,能夠看到3種獎牌各自的排序:

  • 金牌:北京、倫敦、雅典
  • 銀牌:倫敦、亞特蘭大、巴塞羅那
  • 銅牌:北京、里約熱內盧、倫敦

總結

本文通過不同的可視化圖形展示了我國的獲獎情況,數據顯示在北京奧運會中取得成績是最亮眼的;其次,女子的金牌一直都是高於男子,女隊員真的是巾幗不讓鬚眉。希望在這次奧運會中國隊再創輝煌!中國隊,yyds!

------------------- End -------------------

往期精彩文章推薦:

歡迎大家點贊,留言,轉發,轉載,感謝大家的相伴與支持

想加入Python學習羣請在後臺回覆【入羣

萬水千山總是情,點個【在看】行不行

/今日留言主題/

隨便說一兩句吧~~

本文分享自微信公衆號 - Python爬蟲與數據挖掘(crawler_python)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章