回覆“書籍”即可獲贈Python從入門到進階共10本電子書
大家好,我是Peter~
最近奧運會也是非常熱門的事件,但是針對本次奧運會有很多值得吐槽的地方,小島國的騷氣操作不想寫
於是Peter從網上收集的我國從1984年第一次參加夏季奧運會到2016年的歷屆奧運會獲獎情況,瞭解下歷屆的奧運會成績。
數據整理成寬表和長表兩種形式,進行簡單的數據處理和不同方式的可視化圖形展示,方便大家瞭解我國的奧運會成績。
文中全程使用的繪圖工具是高級可視化庫:plotly
往期精選
本文使用的數據很簡單,但是涉及到了很多之前關於Plotly繪圖和Python的文章,推薦閱讀:
圖形預覽
看看部分圖形效果展示:
導入庫
導入的庫主要是兩種:數據處理和繪圖相關
# 數據處理相關
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=[0, 54]
)),
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()
圖形解釋:
-
橫座標:整體的排名。越靠左,數值越小,排名靠前。可以看到北京奧運會是最棒的:整體排名靠左 -
縱座標:每個獎牌的數量,氣泡越大,數量越多。銀牌是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源創計劃”,歡迎正在閱讀的你也加入,一起分享。