技術(shù)菜鳥如何做出好看的奧運(yùn)會(huì)獎(jiǎng)牌榜

大家好,我是杰哥。
2021年7月23日,第32屆夏季奧運(yùn)會(huì)在日本東京拉開帷幕。大賽共設(shè)置33個(gè)大項(xiàng)50個(gè)分項(xiàng)339個(gè)小項(xiàng),是歷屆奧運(yùn)會(huì)中產(chǎn)生金牌最多的一屆 。
中國(guó)隊(duì)已88枚金牌、32枚銀牌、18枚銅牌完美收官,我計(jì)劃用可視化方法看一看歷屆奧運(yùn)會(huì)獎(jiǎng)牌榜。
數(shù)據(jù)準(zhǔn)備
所有數(shù)據(jù)均是從維基百科中獲取,有如下數(shù)據(jù):
中國(guó)歷年奧運(yùn)獎(jiǎng)牌榜成績(jī)

▲ 中國(guó)歷年奧運(yùn)獎(jiǎng)牌榜成績(jī)
歷屆獎(jiǎng)牌榜全球總榜

▲ 歷屆獎(jiǎng)牌榜全球總榜
歷屆各國(guó)獎(jiǎng)牌榜

中國(guó)歷屆單項(xiàng)比賽獎(jiǎng)牌榜

可視化
歷年主辦國(guó)分布圖

夏季奧林匹克運(yùn)動(dòng)會(huì)(Summer Olympic Games或Games of the Olympic)是由國(guó)際奧林匹克委員會(huì)主辦的國(guó)際性多項(xiàng)運(yùn)動(dòng)賽事,每四年舉辦一次。從1904年起,夏季奧運(yùn)會(huì)的每個(gè)項(xiàng)目都會(huì)頒發(fā)獎(jiǎng)牌,其中第一名為金牌,第二名為銀牌,第三名為銅牌。
美國(guó)舉辦過4次夏季奧運(yùn)會(huì),是舉辦奧運(yùn)會(huì)次數(shù)最多的國(guó)家。英國(guó)于2012年第3次舉辦夏季奧運(yùn)會(huì),倫敦成為第1個(gè)舉辦3次夏季奧運(yùn)會(huì)的城市。澳大利亞、法國(guó)、德國(guó)、日本和希臘都舉辦過2次夏季奧運(yùn)會(huì)。
其他舉辦過夏季奧運(yùn)會(huì)的國(guó)家有:中國(guó)、比利時(shí)、加拿大、芬蘭、意大利、墨西哥、荷蘭、韓國(guó)、西班牙、蘇聯(lián)和瑞典。亞洲第1次奧運(yùn)會(huì)在日本東京舉辦。南美洲的第1次奧運(yùn)會(huì)在巴西里約熱內(nèi)盧舉辦。有5個(gè)城市曾2次舉辦過夏季奧運(yùn)會(huì):東京、洛杉磯、倫敦、巴黎和雅典。
繪圖方法
繪圖工具:pyecharts + Microsoft
第一步,利用pyecharts繪制主辦國(guó)及主辦次數(shù)全球地圖可視化,可以直接到官網(wǎng)例子學(xué)習(xí)如何繪制一個(gè)全球圖。
第二步,為地圖標(biāo)上帶箭頭的時(shí)間文字,由于暫未習(xí)得如何在pyecharts地圖上用代碼的方法實(shí)現(xiàn)標(biāo)注,因此可以借助Microsoft手動(dòng)標(biāo)注。
from pyecharts import options as opts
from pyecharts.charts import Map
df_1 = df_total.groupby(['country']).count().reset_index()
c = (
Map()
.add("", [list(z) for z in zip(df_1.country, df_1.年份)], "world",is_map_symbol_show=False)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="數(shù)據(jù)STUDIO"),
visualmap_opts=opts.VisualMapOpts(max_=4,is_show=False),
)
# .render("map_world.html")
)
c.render_notebook()
歷屆獎(jiǎng)牌榜
奧運(yùn)會(huì)是全世界規(guī)模最大的綜合性體育運(yùn)動(dòng)會(huì),全世界的各個(gè)國(guó)家都會(huì)派運(yùn)動(dòng)員來參加!奧運(yùn)會(huì)五大體育強(qiáng)國(guó):1.美國(guó),2.中國(guó),3.英國(guó),4.法國(guó),5.德國(guó)。
截至里約奧運(yùn)會(huì),中國(guó)代表團(tuán)共參加過九屆夏季奧運(yùn)會(huì),累計(jì)取得546枚奧運(yùn)獎(jiǎng)牌,包括224枚金牌 、167枚銀牌、155枚銅牌。

繪圖方法
上圖是按照金牌總數(shù)金牌排序繪圖,由于參賽國(guó)家過多,這里只繪制了金牌總數(shù)TOP30的國(guó)家。
繪圖工具:Plotly + Microsoft
第一步通過以下代碼繪制堆疊柱狀圖,第二步將國(guó)旗圖片與柱狀圖組合。
df_total_country_num = df_total_country.iloc[:30,].iloc[::-1,:]
fig = go.Figure()
fig.add_trace(go.Bar(
x=df_total_country_num['金'],
y=df_total_country_num['國(guó)家'],
name='金牌',
orientation='h',
marker=dict(
color='rgba(242,192,86, 0.6)',
line=dict(color='rgba(242,192,86, 1.0)', width=3)),
textposition='inside',
text=df_total_country_num['金'].values,
textangle = 90))
fig.add_trace(go.Bar(銀牌))
fig.add_trace(go.Bar(銅牌))
fig.update_layout(barmode='stack', height=1000,
width=1000,
title='歷屆獎(jiǎng)牌榜TOP30',
template='ggplot2',
font=dict( size=12, color="Black" ),
plot_bgcolor="#fafafa",
legend=dict(yanchor="top",
y=1.1, xanchor="left", x=0.9))
fig.show()
中國(guó)歷年奧運(yùn)獎(jiǎng)牌榜成績(jī)
翻閱新中國(guó)夏季奧運(yùn)會(huì)歷史,最早可上溯到1984年。中國(guó)在重返國(guó)際奧委會(huì)后首次派出代表團(tuán)參加夏季奧運(yùn)會(huì)。
1988年,乒乓球項(xiàng)目首次進(jìn)入夏季奧運(yùn)會(huì),中國(guó)奪得了4枚金牌中的2枚,奠定了在該項(xiàng)目中不可動(dòng)搖的地位。
1992年,巴塞羅那夏季奧運(yùn)會(huì)上,中國(guó)代表團(tuán)在田徑、柔道中實(shí)現(xiàn)突破 。
1996年,亞特蘭大奧運(yùn)會(huì)上,首次實(shí)現(xiàn)了乒乓球項(xiàng)目的金牌包攬。
2000年,悉尼奧運(yùn)會(huì)上,中國(guó)代表團(tuán)在乒乓球項(xiàng)目再度實(shí)現(xiàn)對(duì)金牌的包攬,舉重、體操、跳水、羽毛球等項(xiàng)目也收獲頗豐,并獲得了中國(guó)隊(duì)在跆拳道項(xiàng)目的首枚金牌。
2004年,雅典奧運(yùn)會(huì),中國(guó)隊(duì)在網(wǎng)球、摔跤和皮劃艇比賽中首次有金牌入賬,劉翔在男子110米欄比賽中為中國(guó)隊(duì)取得歷史上首枚男子徑賽奧運(yùn)金牌,成為國(guó)人的驕傲。
2008年,中國(guó)的首都北京成為奧運(yùn)會(huì)主辦國(guó),中國(guó)取得了51金21銀28銅的優(yōu)異成績(jī),成為奧運(yùn)歷史上首個(gè)登上金牌榜首的亞洲國(guó)家。
2012年,第30屆奧運(yùn)會(huì)在英國(guó)倫敦舉行。羽毛球跟隨乒乓球其后,成為中國(guó)隊(duì)第二個(gè)實(shí)現(xiàn)金牌包攬的項(xiàng)目。
2016年,第31屆里約奧運(yùn)會(huì)上,中國(guó)隊(duì)不僅在乒乓球、跳水等傳統(tǒng)優(yōu)勢(shì)項(xiàng)目上爭(zhēng)金奪銀,而且在場(chǎng)地自行車項(xiàng)目中首次拿到金牌。中國(guó)女排暨1984、2004年兩度奪冠以來,再次登頂,續(xù)寫女排精神的榮耀。
相對(duì)于體育強(qiáng)國(guó)美國(guó)而言,中國(guó)近年來一路逆襲,無時(shí)無刻不在詮釋著中國(guó)的奧運(yùn)精神。


繪圖方法
繪圖工具:Plotly
fig = go.Figure()
fig.add_trace(go.Bar(
x=df_total_year['地點(diǎn)'],
y=df_total_year['金牌'],
name='金牌',
marker_color='gold',
textposition='inside',
text=df_total_year['金牌'].values,
textangle = 90
))
fig.add_trace(go.Bar('銀牌'))
fig.add_trace(go.Bar('銅牌'))
fig.add_trace(go.Scatter(
x=df_total_year['地點(diǎn)'],
y=df_total_year['參賽選手'],
name='參賽選手',
mode='markers+text+lines',
marker_color='black',
marker_size=10,
textposition='top center',
line=dict(color='orange',dash='dash'),
yaxis='y2'))
fig.update_layout(barmode='group', xaxis_tickangle=-45,
title='中國(guó)歷年奧運(yùn)獎(jiǎng)牌榜成績(jī)',
xaxis_title="主辦國(guó)",
yaxis_title="獎(jiǎng)牌數(shù)",
template='ggplot2',
font=dict(size=12, color="Black"),
xaxis=dict(showgrid=False),
yaxis=dict(showgrid=False),
plot_bgcolor="#fafafa",
yaxis2=dict(showgrid=True,overlaying='y',side='right',title='參賽選手'),
legend=dict(yanchor="top",
y=1.3, xanchor="left", x=0.9))
fig.show()
單項(xiàng)比賽項(xiàng)目成績(jī)表
從比賽項(xiàng)目來看,跳水、舉重、體操、乒乓球、射擊、羽毛球是中國(guó)傳統(tǒng)的優(yōu)勢(shì)體育項(xiàng)目。其中,跳水更是以40枚金牌成為了中國(guó)獲得最多金牌的奧運(yùn)項(xiàng)目。


繪圖方法
繪圖工具:Excel
直接選中數(shù)據(jù),插入條形圖,并設(shè)置數(shù)據(jù)點(diǎn)格式,用目標(biāo)圖片對(duì)其進(jìn)行填充(圖片或紋理填充),填充方式為層疊。

酷炫的全球獎(jiǎng)牌分布動(dòng)圖




繪圖方法
繪圖工具:geopandas + imageio
第一步,先利用geopandas繪制出歷年各個(gè)獎(jiǎng)牌的全球分布圖,其中比較影響美觀的參數(shù):cmap,根據(jù)matplotlib顏色集選取合適的顏色,以達(dá)到美觀的效果。
第二步,將上面繪制出的png靜態(tài)圖,通過imageio將其合成動(dòng)態(tài)圖,可以看到獎(jiǎng)牌榜分布隨著時(shí)間的變化情況。
地圖繪制代碼
import geopandas
import matplotlib.colors
import pycountry
import matplotlib.pyplot as plt
def alpha3code(column):
CODE=[]
for country in column:
try:
code=pycountry.countries.get(name=country).alpha_3
CODE.append(code)
except:
CODE.append('None')
return CODE
def draw_geo(geo_temp,col,kind,name,name2,cmap='Set3'):
geo_temp['CODE']=alpha3code(geo_temp['English'])
vmin = 0
vmax = 40
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
world.columns=['pop_est', 'continent', 'name', 'CODE', 'gdp_md_est', 'geometry']
merge=pd.merge(world,geo_temp,on='CODE')
ax = world.plot(figsize=(20,15), linewidth=0.25, edgecolor=background_color, color='lightgray')
ax.axis('off')
# ax.set_facecolor(background_color)
merge.plot(column=col,figsize=(20, 15),cmap=cmap,ax=ax, legend=True,
legend_kwds={'shrink': 0.5},vmin=vmin, vmax=vmax)
ax.text(-175,112,f'{name}年{name2}奧運(yùn)會(huì)',
fontsize=30,fontweight='bold',color='#323232')
ax.text(-175,102,f'{kind}牌總數(shù)',
color='gray',fontsize=20)
plt.show()
plt.savefig(fname=f'{name}.png')
Gif動(dòng)圖合成代碼
import imageio
def create_gif(image_list, gif_name, duration = 2):
"""
生成Gif文件,原始圖像僅僅支持png格式
image_list : 輸入圖像的路徑
gif_name : 字符串,所生成的gif文件名,帶.gif文件名后綴
duration : gif圖像時(shí)間間隔,這里默認(rèn)2s
"""
# 創(chuàng)建一個(gè)空列表,用來存源圖像
frames = []
# 利用方法append把圖片挨個(gè)存進(jìn)列表
for image_name in image_list:
frames.append(imageio.imread(image_name))
# 保存為gif格式的圖
imageio.mimsave(gif_name, frames, 'GIF', duration = duration)
return
def main(name):
image_list = ['1984.png','1988.png','1992.png','1996.png','2000.png',
'2004.png', '2008.png', '2012.png','2016.png']
gif_name = f'{name}.gif'
duration = 1.5
create_gif(image_list, gif_name)
參考資料
[1] 奧運(yùn)會(huì)logo圖片及數(shù)據(jù)來源維基百科: https://zh.wikipedia.org/wiki/夏季奧林匹克運(yùn)動(dòng)會(huì)
[2] 奧運(yùn)歷史資料:https://baijiahao.baidu.com/s?id=1706677041934937288&wfr=spider&for=pc
推薦閱讀

