当前位置: 首页 > 后端技术 > Python

基于Python的图表绘制系统matplotlib,你了解“动态条形图”吗?

时间:2023-03-25 20:13:37 Python

动态柱状图流行了一段时间,尤其是比较历年世界各国GDP或军事实力的动态柱状图,配上动听的音乐,从后往前看中国的排名,作为一个爱国的人,那种有集体荣誉感的真的是澎湃而自豪,好像我也为国力的提升做出了不可磨灭的贡献(捂脸)。虽然我没有做出什么不可磨灭的贡献对于国力的提升,我可以探索一下动态柱状图是怎么画的,应该算是科普一下吧(笑哭)。检查并选择符合要求的数据。先看数据。依旧是英超球队的积分数据。制作动态条形图需要的数据量稍大。对于具有时间维度的数据,时间越长,能够反映的变化和信息越多,这里我们只选取了2010-2019年英超球队的积分数据,数据量不大,但不影响学习原理和实现步骤。选取每年前十名的球队进入数据集,最终的数据集是这样的:我们一步步来,先画一个简单的柱状图,比如画一个柱状图2019年十强球队图表,准备数据,提取2019年的数据,然后排序选出十强球队数据,具体代码如下:year=2019dff=(df_t[df_t["year"].eq(year)].sort_values(by='Integral',ascending=True).tail(10))dffresult:简单解释,这里没有复杂的代码,都是普通语法,除了一个df.eq(),该方法主要是比较,提取df中满足括号内变量要求的数据。原始数据包含2010-2019年的所有数据。这里只需要2019年,所以2019年的数据是这样提取的。下面的排序语法是选择升序,让积分最少的球队排在第一位,所以要选出前十名的球队,不能用head(10)buttail(10),并选择最后10行的队。之所以要这样操作,是因为条形图的绘制过程是从下往上绘制的,而条形图的顺序是从下往上越来越长,所以采用了这个操作。我们来看看上面截取的数据集绘制的条形图长什么样子:plt.figure(figsize=(10,6))plt.barh(dff['team'],dff['points']);ok,绘制的条形图符合要求!设置条形颜色如果不设置颜色,所有绘制的条形都是一种颜色,就像上图一样。为了让图形更美观,让各队得分变化看起来更明显,仍然需要设置颜色。这里有两个选项,一个是为排名设置一个颜色,即不管哪个队第一,只要排名第一,都会分配这个颜色,一个是分配一个颜色给每个队伍,不管队伍的段位有多高,它的颜色都不会改变。实践证明,第二种方法稍微复杂一点,但是更容易接受,所以这里采用第二种方法设置颜色。names=df_t10.Team.unique()#查看进入前十的球队名称,返回一共24支球队:array(['ManchesterUnited','Chelsea','ManchesterCity','Arsenal','热刺','利物浦','埃弗顿','富勒姆','阿斯顿维拉','桑德兰','纽卡斯尔','西布罗姆维奇','斯旺西','西汉姆联','南安普顿','StokeCity','CrystalPalace','Leicester','Bournemouth','WestBrom','Burnley'','LeicesterCity','Wolves','SheffieldUnited'],dtype=object)生成24个不同的颜色:将matplotlib.cm导入为cmc=[]foriinrange(len(names)):c.append(cm.nipy_spectral(float(i)/len(names)))colors1=dict(zip(names,c))#每个队对应一种颜色由于颜色种类很多,一一指定太费时费力,所以引入matplotlib.cmsp??ectral,cm.nipy_spectral()函数,并赋值不同的浮点值生成不同的颜色。plt.figure(figsize=(12,6))#给不同的bar添加不同的颜色时,注意colorlist有24种颜色,不能直接让color等于colorlistforiinrange(len(dff)):plt.barh(dff['团队'].iloc[i],dff['点'].iloc[i],color=colors1[dff['团队'].iloc[i]],alpha=0.5)#在画布右侧添加年份plt.text(1,0.4,current_year,transform=ax.transAxes,size=46,ha='right',alpha=0.5);效果图:实现动画其实大家都知道,所谓的视频也是一帧一帧的组成,按照顺序播放,从而形成视频,而我们的动画就是利用了这个原理,所以只需要封装绘制的代码即可将柱状图转化为一个函数,然后在动态显示中反复调用这个函数,可以实现在不同的数据集上绘制图形。fig,ax=plt.subplots(figsize=(12,6))#同时创建canvas和subplots,如果不设置,默认是一个subplotdefdraw_bar(year):ax.spines['right'].set_color('none')#设置右边框颜色为无色,隐藏右边框ax.spines['top'].set_color('none')#设置上边框颜色为无色,隐藏上边框borderax.spines['left'].set_color('none')#设置右边边框颜色为无色,隐藏左边边框ax.spines['bottom'].set_color('none')#Set顶部边框的颜色变为无色,隐藏下边框#准备数据dff=(df_t[df_t["year"].eq(year)].sort_values(by='integral',ascending=True).tail(10))ax.clear()#clearexistingImageforiinrange(len(dff)):colors=cm.nipy_spectral(float(i)/len(dff))ax.barh(dff['team']].iloc[i],dff['point'].iloc[i],height=0.7,color=colors1[dff['team'].iloc[i]],alpha=0.5)ax.text(dff['point'].iloc[i]-3,i+0.1,dff['团队'].iloc[i])ax.text(dff['point'].iloc[i]-2,i-0.3,dff['point'].iloc[i])ax.text(1,0.4,year,transform=ax.transAxes,color='#777777',size=46,ha='right',alpha=0.5,weight=800)ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))ax.xaxis.set_ticks_position('top')ax.tick_params(axis='x',colors='#777777',labelsize=12)ax.set_yticks([])ax.margins(0,0.01)ax.grid(which='major',axis='x',linestyle='-')ax.set_axisbelow(True)ax.text(0.2,1.1,'2010--2019英超球队年度积分',transform=ax.transAxes,size=20,weight=600,ha='left');draw_bar(2019)函数已经封装好了,接下来要实现动画的精彩运行,需要matplotlib中的animation模块,使用该模块中的FuncAnimation方法重复调用上面定义的绘图函数来实现动画效果:importmatplotlib.animationasanimation#importanimationmodulefromIPython.displayimportHTML#importHTMLmodulefig,ax=plt.subplots(figsize=(10,6))animator=animation.FuncAnimation(fig,draw_bar,frames=range(2010,2020),interval=600)#interval控制切换速度,默认为200毫秒HTML(animator.to_jshtml())#Embed渲染的HTML输出到iPythonoutputanimator.save('yingchao.gif',writer='imagemagick')#保存gif动态图动态条形图就讲完了,代码不是很复杂,完整的过程就是最后两段代码,前面的代码主要是分解中间过程为了便于理解。有兴趣的小伙伴可以深入研究或者更改数据集看看实现效果