> 足球新闻
初始化一些设置,画布背景色、字体颜色、默认字体,字体大小,此处选择中文字体。
from highlight_text import ax_text,fig_text
import mplsoccer
# 背景色
background = '#D6DBD9'
# 字体颜色
text_color = 'black'
mpl.rcParams['xtick.color'] = text_color
mpl.rcParams['ytick.color'] = text_color
mpl.rcParams['text.color'] = text_color
# 中文字体
mpl.rcParams['font.family'] = 'Songti SC'
mpl.rcParams['legend.fontsize'] = 12
新建一个画布。
# 新建画布
fig, ax = plt.subplots(figsize=(10, 8))
# 关闭坐标轴
ax.axis('off')
# 背景色填充
fig.set_facecolor(background)
plt.show()
显示如下。
绘制19-20赛季,C罗的进球情况。
# 垂直方向半个足球场
pitch = mplsoccer.VerticalPitch(half=True, pitch_type='opta', line_zorder=3, pitch_color='grass')
# 图表大小
ax_opta1 = fig.add_axes((0.05, 0.06, 0.45, 0.4))
ax_opta1.patch.set_facecolor(background)
pitch.draw(ax=ax_opta1)
plt.show()
通过设置mplsoccer的参数,绘制半个足球场。
果然,左下方有半个足球场。
将射门数据用散点图表示,分为进球得分和未成功进球得分两种情况。
# 2019-2020赛季, C罗射门位置散点图(未得分), 透明度0.6
df_fil = df_understat.loc[df_understat['Season'] == 2019]
pitch.scatter(df_fil[df_fil['Result'] != 'Goal']['X'], df_fil[df_fil['Result'] != 'Goal']['Y'],
s=np.sqrt(df_fil[df_fil['Result'] != 'Goal']['xG'])*100, marker='o', alpha=0.6,
edgecolor='black', facecolor='grey', ax=ax_opta1)
plt.show()
未得分射门散点图。
得分散点图。
# 2019-2020赛季, C罗射门位置散点图(得分), 透明度0.9
pitch.scatter(df_fil[df_fil['Result'] == 'Goal']['X'], df_fil[df_fil['Result'] == 'Goal']['Y'],
s=np.sqrt(df_fil[df_fil['Result'] == 'Goal']['xG'])*100, marker='o', alpha=0.9,
edgecolor='black', facecolor='#6778d0', ax=ax_opta1, label='Goal')
plt.show()
结果如下,失败的比成功的多。
这样,我们就将C罗在2019-2020赛季的所有射门点数据可视化出来了。
其中散点的大小,是预期进球的大小。
添加标签及图例,设置相应的位置、文字、字体等设置。
# 添加图例
ax_opta1.legend(loc='lower right').get_texts()[0].set_color("black")
# 文字信息
ax_opta1.text(30, 61, '得分次数 : '+str(len(df_fil[df_fil['Result'] == 'Goal'])), weight='bold', size=11)
ax_opta1.text(30, 64, f"预期进球 : {round(sum(df_fil['xG']),2)}", weight='bold', size=11)
ax_opta1.text(30, 58, '射门次数 : '+str(len(df_fil)), weight='bold', size=11)
ax_opta1.text(90, 60, '2019-20赛季', weight='bold', size=14)
plt.show()
成功添加附加信息。
显示赛季、xG、得分次数、射门次数信息。
同样将20-21赛季的数据绘制出来,放置在19-20赛季的右侧。
# 2020-2021赛季, C罗射门位置散点图
ax_opta2 = fig.add_axes((0.50, 0.06, 0.45, 0.4))
ax_opta2.patch.set_facecolor(background)
pitch.draw(ax=ax_opta2)
# 根据条件, 筛选数据
df_fil = df_understat.loc[df_understat['Season'] == 2020]
# 未得分
pitch.scatter(df_fil[df_fil['Result'] != 'Goal']['X'], df_fil[df_fil['Result'] != 'Goal']['Y'],
s=np.sqrt(df_fil[df_fil['Result']!='Goal']['xG'])*100, marker='o', alpha=0.6,
edgecolor='black', facecolor='grey', ax=ax_opta2)
# 得分
pitch.scatter(df_fil[df_fil['Result']=='Goal']['X'], df_fil[df_fil['Result'] == 'Goal']['Y'],
s=np.sqrt(df_fil[df_fil['Result'] == 'Goal']['xG'])*100, marker='o', alpha=0.9,
edgecolor='black', facecolor='#6778d0', ax=ax_opta2, label='Goal')
# 添加图例, 文字信息
ax_opta2.legend(loc='lower right').get_texts()[0].set_color("black")
ax_opta2.text(30, 61, '得分次数 : '+str(len(df_fil[df_fil['Result'] == 'Goal'])), weight='bold', size=11)
ax_opta2.text(30, 64, f"预期进球 : {round(sum(df_fil['xG']),2)}", weight='bold', size=11)
ax_opta2.text(30, 58, '射门次数 : '+str(len(df_fil)), weight='bold', size=11)
ax_opta2.text(90, 60, '2020-21赛季', weight='bold', size=14)
plt.show()
结果如下。
C罗老当益壮啊,状态一点也没有下滑。
下面接着绘制所有球员的数据散点图,看看C罗的数据能在哪一档?
# 初始化
ax_scatter = fig.add_axes([0.52, 0.57, 0.4, 0.35])
ax_scatter.patch.set_facecolor(background)
plt.show()
创建一个坐标轴。
首先对数据进行筛选,上场时间最少要有900s,而且位置为前锋此类的。
毕竟我们不能拿个守门员,跟C罗比数据吧,参考意义不大。
# 得到散点图的X, Y坐标值
no_90s = 10
df_fil = df_fbref[df_fbref['90s'] >= no_90s]
# 前锋位置
df_fil = df_fil[df_fil['Pos'].apply(lambda x: x in ['FW', 'MF,FW', 'FW,MF'])]
# 每90s预期进球和得分次数
x, y = (df_fil['xG']/df_fil['90s']).to_list(), (df_fil['Gls']/df_fil['90s']).to_list()
# 生成所有前锋位置, 数据散点图
ax_scatter.scatter(x, y, alpha=0.3, c='#EF8804')
plt.show()
所有球员每90s预期进球和得分次数的数据情况。
现在我们筛选出C罗的数据,在散点图上用不同的颜色及透明度来突出显示它。
# C罗的数据
df_player = df_fil[df_fil['Player'] == 'Cristiano Ronaldo']
ax_scatter.scatter(df_player['xG']/df_player['90s'], df_player['Gls']/df_player['90s'], c='blue')
plt.show()
结果如下。
可以看到C罗的数据还是比较高效的,虽不是第一,但也是前几的存在。
最后给散点图添加网格线,以及x轴和y轴标签。
# 添加网格线及标签
ax_scatter.grid(b=True, color='grey',
linestyle='-.', linewidth=0.5,
alpha=0.4)
ax_scatter.set_xlabel('每90秒的预期进球', fontdict={'fontsize': 12, 'weight': 'bold', 'color': text_color})
ax_scatter.set_ylabel('每90秒得分', fontdict=dict(fontsize=12, weight='bold', color=text_color))
plt.show()
结果如下。
不愧是C罗,在2020-21赛季几乎每90秒就能进1颗球。
18年就已经有一个记录!C罗成历史第一位在90分钟内每分钟都有进球的球员。
最后添加文本信息,包含标题,C罗的头像,场上位置、年龄、效力球队。
此处使用hightlight-text库,可以高亮文本。
# 添加C罗的头像
ax_player = fig.add_axes([0.03, 0.53, 0.25, 0.45])
ax_player.axis('off')
im = plt.imread('ronaldo.png')
ax_player.imshow(im)
# 添加标题信息
fig_text(0.03, 0.94, "<克里斯蒂亚诺·罗纳尔多(C罗)> 赛季数据", weight='heavy', size=19, highlight_textprops=[{'color': 'blue'}])
fig_text(0.25, 0.85, '位置: <边锋>',weight='bold', size=15, highlight_textprops=[{'color':'#EF8804'}])
fig_text(0.25, 0.81, '年龄: <36>',weight='bold', size=15, highlight_textprops=[{'color':'red'}])
# 添加俱乐部logo
ax_team = fig.add_axes([0.27, 0.55, 0.15, 0.15])
ax_team.axis('off')
im = plt.imread('FCJ.png')
ax_team.imshow(im)
# 添加备注
fig_text(0.07, 0.03, '本图制作者:<小F> 数据来源:Fbref.com、Understat.com',
size=12, highlight_textprops=[{'color': '#EF8804'}], weight='bold')
plt.show()
得到结果如下。
保存为图片。
# 保存为图片
plt.savefig('ronaldo_viz.png', dpi=300, facecolor=background)
看起来还不错哦。
好了,本期的分享就到此结束了,有兴趣的小伙伴可以自行去实践学习。
获取本文相关代码和数据,请点击下方公众号名片,回复关键字
足球
快给自己喜欢的足球运动员,也制作一个赛季数据面板吧!
如果文章对你有帮助,欢迎转发/点赞/收藏~
足球新闻
热门标签
JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费看精彩直播比赛,上JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费观看JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费无插件低调看直播nba,JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费nba(无插件)直播,JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费免费高清在线观看精彩内容,上JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费观看每一个比赛精彩瞬间。
JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费 | All Football App 网站地图
Copyright © 2021-2024 JRS直播网-JRS低调看高清直播_NBA直播_NBA直播在线观看免费. All Rights Reserved.