中國奧運(yùn)會成績,知道多少?13張圖告訴你

轉(zhuǎn)自:尤而小屋
作者: peter
最近奧運(yùn)會也是非常熱門的事件,但是針對本次奧運(yùn)會有很多值得吐槽的地方,小島國的騷氣操作不想寫??
于是Peter從網(wǎng)上收集的我國從1984年第一次參加夏季奧運(yùn)會到2016年的歷屆奧運(yùn)會獲獎情況,了解下歷屆的奧運(yùn)會成績。
數(shù)據(jù)整理成寬表和長表兩種形式,進(jìn)行簡單的數(shù)據(jù)處理和不同方式的可視化圖形展示,方便大家了解我國的奧運(yùn)會成績。
文中全程使用的繪圖工具是高級可視化庫:plotly
圖形預(yù)覽
看看部分圖形效果展示:


導(dǎo)入庫
導(dǎo)入的庫主要是兩種:數(shù)據(jù)處理和繪圖相關(guān)
# 數(shù)據(jù)處理相關(guān)
import pandas as pd
import numpy as np
# 繪圖相關(guān)
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots # 制作多子圖
兩種形式數(shù)據(jù)
從網(wǎng)上收集的中國隊歷屆夏季奧運(yùn)會獲獎情況,整理成兩種形式:寬表和長表
1、寬表
寬表形式是將字段盡可能多羅列出來


2、長表
長表形式是將字段盡可能減少,同一個字段的數(shù)據(jù)信息可能出現(xiàn)重復(fù)


中國參加了多少屆夏季奧運(yùn)會
主要講解的是Python中字符串格式化的知識點(diǎn),3種不同的格式化展示方式:
占位符%s format() f-string

總獎牌數(shù)
展示的是中國歷屆奧運(yùn)會的總獎牌數(shù)變化趨勢:
fig = px.line(df,x="地點(diǎn)",y="總數(shù)",text="總數(shù)")
fig.update_layout(title="中國獲得總獎牌數(shù)")
fig.show()

從結(jié)果的圖形中,我們看到2008年是最多的,剛好是100枚??畢竟是家門口的比賽
fig = px.scatter(
df,
x="地點(diǎn)",
y="總數(shù)",
color="金牌",
size="總數(shù)",
text="總數(shù)"
)
fig.show()

男子和女子金牌對比


從結(jié)果中我們可以看出來:
1984年第一次參加奧運(yùn)會,男子金牌數(shù)量是高于女子的 此后,每屆都是女子高于男子:巾幗不讓須眉??
多指標(biāo)變化
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df["年份"].tolist(),
y=df["總數(shù)"].tolist(),
name="總數(shù)"
))
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()

多指標(biāo)變化
通過子圖的形式展示不同指標(biāo)的變化趨勢:
# 兩個基本參數(shù):設(shè)置行、列
fig = make_subplots(rows=4, cols=2,
subplot_titles=["獎牌總數(shù)","金牌","銀牌","銅牌","金牌榜","男子金牌","女子金牌","金牌占比"])
# 添加數(shù)據(jù)軌跡
fig.add_trace(go.Scatter(
x=df["年份"].tolist(),
y=df["總數(shù)"].tolist(),
name="總數(shù)"
),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)
# 設(shè)置圖形的寬高和標(biāo)題
fig.update_layout(height=600,
width=800,
title_text="奧運(yùn)會獎牌可視化")
fig.show()

雷達(dá)圖
雷達(dá)圖展示的是不同年份的獲獎情況
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='里約熱內(nèi)盧-2016'
))
fig.update_layout(
polar=dict(
radialaxis=dict(
visible=True,
range=[0, 54]
)),
showlegend=True
)
fig.show()



小結(jié):從雷達(dá)圖的不同維度頂端觸角,就可以觀察到各自的最大值,比如金牌和銅牌最多的就是北京奧運(yùn)會,銀牌最多的是倫敦奧運(yùn)會
??:上面的圖形都是基于寬表形式的數(shù)據(jù),下面是基于長表形式
金銀銅牌對比
3種不同獎牌的地點(diǎn)(年份)對比情況:
px.bar(df2,
x="地點(diǎn)",
y="數(shù)量",
color="獎牌",
text="數(shù)量",
barmode="group"
)

多子圖-不同年份的3種獎牌數(shù)
# 不共享y軸
fig = px.scatter(
df2,
x="排名",
y="數(shù)量",
color="獎牌",
size="數(shù)量",
facet_col="年份",
facet_col_wrap=3
)
#fig.update_yaxes(matches=None) # 不共享y軸
fig.show()

圖形解釋:
橫坐標(biāo):整體的排名。越靠左,數(shù)值越小,排名靠前。可以看到北京奧運(yùn)會是最棒的:整體排名靠左 縱坐標(biāo):每個獎牌的數(shù)量,氣泡越大,數(shù)量越多。銀牌是2012年倫敦,銅牌是2008年北京(看點(diǎn)的高度)
3種獎牌整體占比


3種獎牌不同年份占比
3種獎牌在不同屆奧運(yùn)會的占比情況:
# 兩個基本參數(shù):設(shè)置行、列
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-里約熱內(nèi)盧"])
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][:3].tolist(),
name="1984-洛杉磯"
),1,1)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][3:6].tolist(),
name="1988-漢城"
),1,2)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][6:9].tolist(),
name="1992-巴塞羅那"
),1,3)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][9:12].tolist(),
name="1996-亞特蘭大"
),2,1)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][12:15].tolist(),
name="2000-悉尼"
),2,2)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][15:18].tolist(),
name="2004-雅典"
),2,3)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][18:21].tolist(),
name="2008-北京"
),3,1)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][21:24].tolist(),
name="2012-倫敦"
),3,2)
fig.add_trace(go.Pie(
labels=df2["獎牌"][:3].tolist(),
values=df2["數(shù)量"][24:27].tolist(),
name="2016-里約熱內(nèi)盧"
),3,3)
fig.update_traces(hole=0.2)
fig.show()

從圖形可以看出來:
北京奧運(yùn)會占比最高:51%;其次是雅典奧運(yùn)會 1988年的漢城奧運(yùn)會最低,才17.9%
3種獎牌旭日圖
px.sunburst(df2,path=["獎牌","地點(diǎn)"],
values="數(shù)量",
color="年份",
color_continuous_scale="RdBu"
)

根據(jù)3種獎牌的旭日圖,能夠看到3種獎牌各自的排序:
金牌:北京、倫敦、雅典 銀牌:倫敦、亞特蘭大、巴塞羅那 銅牌:北京、里約熱內(nèi)盧、倫敦
總結(jié)
本文通過不同的可視化圖形展示了我國的獲獎情況,數(shù)據(jù)顯示在北京奧運(yùn)會中取得成績是最亮眼的;其次,女子的金牌一直都是高于男子,女隊員真的是巾幗不讓須眉。希望在這次奧運(yùn)會中國隊再創(chuàng)輝煌!中國隊????,yyds!
最后推薦一下我們的星球:由菜鳥學(xué)Python原班人馬建了一個投資星球,匯聚一批喜歡投資的朋友一起分享投資的技巧,不限于基金,股票等其他品種,提高自己的財商,一起讀書打卡,歡迎加入。
推薦閱讀:
入門: 最全的零基礎(chǔ)學(xué)Python的問題 | 零基礎(chǔ)學(xué)了8個月的Python | 實戰(zhàn)項目 |學(xué)Python就是這條捷徑
干貨:爬取豆瓣短評,電影《后來的我們》 | 38年NBA最佳球員分析 | 從萬眾期待到口碑撲街!唐探3令人失望 | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個海量小姐姐素描圖 |碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
趣味:彈球游戲 | 九宮格 | 漂亮的花 | 兩百行Python《天天酷跑》游戲!
AI: 會做詩的機(jī)器人 | 給圖片上色 | 預(yù)測收入 | 碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影
小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水印! | 一鍵把html網(wǎng)頁保存為pdf!| 再見PDF提取收費(fèi)! | 用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r機(jī)票提示器! |60行代碼做了一個語音壁紙切換器天天看小姐姐!|
年度爆款文案
點(diǎn)閱讀原文,領(lǐng)廖雪峰資料!


