matplotlib画折线图怎么画多条线,matplot画折线图
大家好,今天分享一个非常有趣的计算机编程语言教程,如何美化一个绘制精美的图表折线图,喜欢记得收藏、关注、点赞。
注:数据、完整代码、技术交流文末获取
1.导入包进口熊猫作为螺纹中径
将matplotlib.pyplot作为血小板计数导入
将matplotlib.ticker作为心脏导入
将matplotlib.gridspec作为gridspec2导入。获得数据file _ id= 1yM _ f93 ny 4 qkxjlkl 3 gzdccqenbia 2 ltb
url=fhttps://drive.google.com/uc?id={文件id}
df=pd.read_csv(网址,索引列=0)
df数据长得是这样的:
3.对数据做一些预处理按照需要,对数据再做一些预处理,代码及效果如下:
home_df=df.copy()
home _ df=home _ df。melt(id _ vars=[ date , home_team_name , away_team_name])
home_df[venue]=H
home _ df。rename(columns={ home _ team _ name : team , away _ team _ name : opposite },inplace=True)
home _ df。replace({ variable :{ home _ team _ xG : xG _ for , away_team_xG:xG_ag}},inplace=True)away_df=df.copy()
远离_ df=远离_ df。melt(id _ vars=[ date , away_team_name , home_team_name])
away_df[venue]=A
away _ df。rename(columns={ away _ team _ name : team , home _ team _ name : opposite },inplace=True)
away _ df。替换({ variable :{ away _ team _ xG : xG _ for , home_team_xG:xG_ag}},in place=True)df=PD。concat([home _ df,away_df]).reset_index(drop=True)
df
4.画图# -过滤数据
y _ for=df[(df[ team ]= Lazio )(df[ variable ]= xG _ for )][ value ].reset_index(drop=True)
y _ ag=df[(df[ team ]= Lazio )(df[ variable ]= xG _ ag )][ value ].reset_index(drop=True)
X_=pd .系列(range(len(Y_for)))
# -计算滚动平均值
Y_for=Y_for.rolling(窗口=5,最小周期=0).平均值()#最小周期数用于部分平均值。
Y_ag=Y_ag.rolling(window=5,min_periods=0).mean()fig,ax=plt.subplots(figsize=(7,3),dpi=200)
ax.plot(X_,Y_for)
ax.plot(X_,Y_ag)
使用绘制精美的图表倒是可以快速把图画好了,但是太丑了。接下来进行优化。
4.1 优化:添加点这里为每一个数据添加点
fig,ax=plt.subplots(figsize=(7,3),dpi=200)
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.5,color=#4E616C )
# -数据
ax.plot(X_,Y_for,marker=o )
ax.plot(X_,Y_ag,marker=o )
4.2 优化:设置刻度fig,ax=plt.subplots(figsize=(7,3),dpi=200)
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.25,color=#4E616C )
# -数据
ax.plot(X_,Y_for,marker=o ,mfc=white ,ms=5)
ax.plot(X_,Y_ag,marker=o ,mfc=white ,ms=5)
# -调整滚动条和书脊以匹配网格的风格
斧头。xaxis。set _ major _ locator(ticker .多重定位器(2)) #收报机每2个比赛日
X ticks _=ax。xaxis。set _ tick标签([X-1表示范围内的X(0,len(X_) 3,2)])
#最后一行输出
# [-1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35]
#我们每两个位置标记一次。
斧头。xaxis。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
斧头。雅克斯。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
ax.spines[bottom].set _ edge颜色(# 4e 616 c)
4.3 优化:设置填充fig,ax=plt.subplots(figsize=(7,3),dpi=200)
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.25,color=#4E616C )
# -数据
ax.plot(X_,Y_for,marker=o ,mfc=white ,ms=5)
ax.plot(X_,Y_ag,marker=o ,mfc=white ,ms=5)
# -填充之间
ax.fill_between(x=X_,y1=Y_for,y2=Y_ag,alpha=0.5)
# -调整滚动条和书脊以匹配网格的风格
斧头。xaxis。set _ major _ locator(ticker .多重定位器(2)) #收报机每2个比赛日
X ticks _=ax。xaxis。set _ tick标签([X-1表示范围内的X(0,len(X_) 3,2)])
斧头。xaxis。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
斧头。雅克斯。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
ax.spines[bottom].set _ edge颜色(# 4e 616 c)
4.4 优化:设置填充颜色当橙色线更高时,希望填充为橙色。但是上面的还无法满足,这里再优化一下fig,ax=plt.subplots(figsize=(7,3),dpi=200)
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.25,color=#4E616C )
# -数据
ax.plot(X_,Y_for,marker=o ,mfc=white ,ms=5)
ax.plot(X_,Y_ag,marker=o ,mfc=white ,ms=5)
# -填充之间
#确定Y _代表Y_ag的点
pos_for=(Y_for Y_ag)
ax.fill_between(x=X_[pos_for],y1=Y_for[pos_for],y2=Y_ag[pos_for],alpha=0.5)
pos_ag=(Y_for=Y_ag)
ax.fill_between(x=X_[pos_ag],y1=Y_for[pos_ag],y2=Y_ag[pos_ag],alpha=0.5)
# -调整滚动条和书脊以匹配网格的风格
斧头。xaxis。set _ major _ locator(ticker .多重定位器(2)) #收报机每2个比赛日
X ticks _=ax。xaxis。set _ tick标签([X-1表示范围内的X(0,len(X_) 3,2)])
斧头。xaxis。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
斧头。雅克斯。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
ax.spines[bottom].set _ edge颜色(# 4e 616 c)
上面的图出现异常,再修改一下:
X_aux=X_ .复制()
X _ aux . index=X _ aux . index * 10 9每场比赛之间的辅助点数
last_idx=X_aux.index[-1] 1
X _ aux=X _ aux。reindex(range(last _ idx))
X_aux=X_aux.interpolate()
# -为xg血型创建的补助的系列(Y_for)
Y_for_aux=Y_for.copy()
Y _ for _ aux.index=Y _ for _辅助。指数* 10
last_idx=Y_for_aux.index[-1] 1
Y _ for _ aux=Y _ for _ auxreindex(range(last _ idx))
Y _ for _ aux=Y _ for _ aux插值()
#-xG让步的辅助系列(Y_ag)
Y_ag_aux=Y_ag.copy()
Y _ ag _ aux。index=Y _ ag _ aux。指数* 10
last_idx=Y_ag_aux.index[-1] 1
Y _ ag _ aux=Y _ ag _ aux。reindex(range(last _ idx))
Y_ag_aux=Y_ag_aux.interpolate()
fig,ax=plt.subplots(figsize=(7,3),dpi=200)
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.25,color=#4E616C )
# -数据
for_=ax.plot(X_,Y_for,marker=o ,mfc=white ,ms=5)
ag_=ax.plot(X_,Y_ag,marker=o ,mfc=white ,ms=5)
# -填充之间
对于范围内的索引(len(X_aux) - 1):
#根据顶部线条选择颜色
如果Y _ for _ aux。iloc[index 1]Y _ ag _ aux。iloc[索引1]:
color=for_[0].get_color()
否则:
color=ag_[0].get_color()
#在当前点和咕噜咕噜叫扩展系列中的下一个点之间填充。
ax.fill_between([X_aux[index],X_aux[index 1]],
[Y_for_aux.iloc[index],Y_for_aux.iloc[index 1]],
[Y_ag_aux.iloc[index],Y_ag_aux.iloc[index 1]],
颜色=颜色,zorder=2,alpha=0.2,ec=无)
# -调整滚动条和书脊以匹配网格的风格
斧头。xaxis。set _ major _ locator(ticker .多重定位器(2)) #收报机每2个比赛日
X ticks _=ax。xaxis。set _ tick标签([X-1表示范围内的X(0,len(X_) 3,2)])
斧头。xaxis。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
斧头。雅克斯。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
ax.spines[bottom].set _ edge颜色(# 4e 616 c)
5.把功能打包成函数上面的样子都还不错啦,接下来把这些东西都打包成一个函数。方便后面直接出图def plot_xG_rolling(team,ax,window=5,color_for=blue ,color_ag=orange ,data=df):
此功能为给定团队和滚动创建一个滚动平均xg血型图
窗户。
团队(str):团队的名称
ax (obj):一个Matplotlib轴。
窗口(整数):我们的滚动平均的周期数。
颜色_for(字符串):为xg血型创建的十六进制颜色代码。
color_af (str):让步xg血型的十六进制颜色代码。
数据(数据帧):我们的df和xg血型数据。
# -准备数据
home_df=data.copy()
home _ df=home _ df。melt(id _ vars=[ date , home_team_name , away_team_name])
home_df[venue]=H
home _ df。rename(columns={ home _ team _ name : team , away _ team _ name : opposite },inplace=True)
home _ df。replace({ variable :{ home _ team _ xG : xG _ for , away_team_xG:xG_ag}},inplace=True)
away_df=data.copy()
远离_ df=远离_ df。melt(id _ vars=[ date , away_team_name , home_team_name])
away_df[venue]=A
away _ df。rename(columns={ away _ team _ name : team , home _ team _ name : opposite },inplace=True)
away _ df。replace({ variable :{ away _ team _ xG : xG _ for , home_team_xG:xG_ag}},inplace=True)
df=pd.concat([home_df,away_df]).reset_index(drop=True)
# -过滤数据
y _ for=df[(df[队]==队)(df[变量]= xG _ for )][值].reset_index(drop=True)
y _ ag=df[(df[ team ]==team)(df[ variable ]= xG _ ag )][ value ].reset_index(drop=True)
X_=pd .系列(range(len(Y_for)))
如果Y_for.shape[0]==0:
提高值错误(fTeam {team}不在数据帧中)
# -计算滚动平均值
Y_for=Y_for.rolling(窗口=5,最小周期=0).平均值()#最小周期数用于部分平均值。
Y_ag=Y_ag.rolling(window=5,min_periods=0).平均值()
# -为曲线之间的填充创建辅助系列
X_aux=X_ .复制()
X _ aux . index=X _ aux . index * 10 9每场比赛之间的辅助点数
last_idx=X_aux.index[-1] 1
X _ aux=X _ aux。reindex(range(last _ idx))
X_aux=X_aux.interpolate()
# -为xg血型创建的补助的系列(Y_for)
Y_for_aux=Y_for.copy()
Y _ for _ aux.index=Y _ for _辅助。指数* 10
last_idx=Y_for_aux.index[-1] 1
Y _ for _ aux=Y _ for _ auxreindex(range(last _ idx))
Y _ for _ aux=Y _ for _ aux插值()
#-xG让步的辅助系列(Y_ag)
Y_ag_aux=Y_ag.copy()
Y _ ag _ aux。index=Y _ ag _ aux。指数* 10
last_idx=Y_ag_aux.index[-1] 1
Y _ ag _ aux=Y _ ag _ aux。reindex(range(last _ idx))
Y_ag_aux=Y_ag_aux.interpolate()
# -绘制我们的数据
# -删除脊线并添加网格线
ax.spines[左]。set_visible(False)
ax.spines[top].set_visible(False)
ax.spines[右]。set_visible(False)
ax.grid(ls= -,lw=0.25,color=#4E616C )
# -数据
for_=ax.plot(X_,Y_for,marker=o ,mfc=white ,ms=4,color=color_for)
ag_=ax.plot(X_,Y_ag,marker=o ,mfc=white ,ms=4,color=color_ag)
# -填充之间
对于范围内的索引(len(X_aux) - 1):
#根据顶部线条选择颜色
如果Y _ for _ aux。iloc[index 1]Y _ ag _ aux。iloc[索引1]:
color=for_[0].get_color()
否则:
color=ag_[0].get_color()
#在当前点和咕噜咕噜叫扩展系列中的下一个点之间填充。
ax.fill_between([X_aux[index],X_aux[index 1]],
[Y_for_aux.iloc[index],Y_for_aux.iloc[index 1]],
[Y_ag_aux.iloc[index],Y_ag_aux.iloc[index 1]],
颜色=颜色,zorder=2,alpha=0.2,ec=无)
# -确保Y轴的最小值为零
ax.set_ylim(0)
# -调整滚动条和书脊以匹配网格的风格
斧头。xaxis。set _ major _ locator(ticker .多重定位器(2)) #收报机每2个比赛日
X ticks _=ax。xaxis。set _ tick标签([X-1表示范围内的X(0,len(X_) 3,2)])
斧头。xaxis。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
斧头。雅克斯。set _ tick _ params(length=2,color=#4E616C ,labelcolor=#4E616C ,labelsize=6)
ax.spines[bottom].set _ edge颜色(# 4e 616 c)
# -传奇和团队名称
Y_for_last=Y_for.iloc[-1]
Y_ag_last=Y_ag.iloc[-1]
# -添加团队名称
team_=ax.text(
x=0,y=ax。get _ ylim()[1]ax。get _ ylim()[1]/20,
s=f"{ team } ",
color=#4E616C ,
va=中心,
哈=左,
尺寸=7
)
# -添加xg血型创建的标签
for_label_=ax.text(
x=X_ .iloc[-1] 0.75,y=Y_for_last,
s=f{Y_for_last:1f} xGF ,
color=color_for,
va=中心,
哈=左,
尺寸=6.5
)
# -添加xg血型让步标签
ag_label_=ax.text(
x=X_ .iloc[-1] 0.75,y=Y_ag_last,
s=f{Y_ag_last:1f} xGA ,
color=color_ag,
va=中心,
哈=左,
尺寸=6.5
)6.1 测试函数file _ id= 1yM _ f93 ny 4 qkxjlkl 3 gzdccqenbia 2 ltb
url=fhttps://drive.google.com/uc?id={文件id}
df=pd.read_csv(url,index _ col=0)fig=PLT。图(图大小=(5,2),dpi=200)
ax=plt.subplot(111)
plot_xG_rolling(Sassuolo ,ax,color_for=#00A752 ,color_ag=black ,data=df)
plt.tight_layout()
再设置更加丰富的颜色:
fig=plt.figure(figsize=(5,8),dpi=200,facecolor=#EFE9E6 )
ax1=plt.subplot(411,facecolor=#EFE9E6 )
ax2=plt.subplot(412,facecolor=#EFE9E6 )
ax3=plt.subplot(413,facecolor=#EFE9E6 )
ax4=plt.subplot(414,facecolor=#EFE9E6 )
plot_xG_rolling(Sassuolo ,ax1,color_for=#00A752 ,color_ag=black ,data=df)
plot_xG_rolling(Lazio ,ax2,color_for=#87D8F7 ,color_ag=#15366F ,data=df)
plot_xG_rolling(Hellas Verona ,ax3,color_for=#153aab ,color_ag=#fdcf41 ,data=df)
plot_xG_rolling(Empoli ,ax4,color_for=#00579C ,color_ag=black ,data=df)
plt.tight_layout()
最后其实本文主要是对两个折线图做了一系列的优化和改进而已,主要是强调细节部分。
涉及到的绘制精美的图表的知识,也主要是在扁虱,背景颜色、填充_之间部分。
技术交流欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源兴趣方向,方便找到志同道合的朋友
方式微信搜索公众号:Python学习与数据挖掘,后台回复:加群
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。