本文探讨了如何绘制多分类柱状图,例如包含语文、数学、英语成绩的各学校柱状图。在绘制之前,我们先回顾一下条形图函数中主要参数的含义:x控制每个条形在x轴方向的位置;height控制每个条的长度;width控制每个bar的宽度;bottom控制每个条在y轴方向上的起始位置。orientation控制bar的方向,是垂直还是水平,默认是垂直的。帮助理解的小例子:x=[0.7,1.5,2,3]height=[3,10,12,7]plt.bar(x,height,width=0.3,bottom=[3,0,0,1])plt.show()参考代码和图形了解各个参数的作用。ok,万事俱备,开始画画吧!在敲代码前先看看原始数据data1长什么样:plt.figure(figsize=(16,6))x_s=np.array(list(range(0,20,2)))#设置bar的theChinesescoreLocationplt.bar(x_s,data1.loc[:,"Chinese").iloc[:10],width=0.5)#绘制中文分数条形图x_y=np.array(list(range(0,20,2)))+0.5#设置数学成绩条的位置plt.bar(x_y,data1.loc[:,"Mathematics"].iloc[:10],width=0.5)#绘制条ofmathscoresFigurex_y=np.array(list(range(0,20,2)))+1#设置英语成绩条的位置plt.bar(x_y,data1.loc[:,"English"].iloc[:10],width=0.5)#绘制英语成绩条形图plt.title("ScoreBarChart",fontsize=14)plt.ylabel("Score",fontsize=14)plt.xticks(x_s+0.5,data1.iloc[:,0].iloc[:10],fontsize=12)#x轴刻度是各个学校的名字,这样刻度刚好在三个条的中间,设(x_s+0.5)plt.legend(["语文","数学","英语"]);在坐标轴和rc参数设置的解释中提到,可以在同一个画布上重复绘制,其实就是在条形图中绘制这个原理适用于多类别的条形图。需要注意的是后面绘制的图形不能覆盖前面绘制的图形,所以需要提前计算好每根柱子应该画在哪里。通过代码可以看到都做了哪些设置。每条bar的宽度为0.5,所以绘制完第一个主题的条形图后,将所有绘制在第二个位置的条形图排列每个bar的x轴位置在位置的基础上增加0.5第一科目横杆的距离,第三科目横杆的距离在第二科目横杆位置的基础上增加0.5。这样一来,每一个学校的三个科目就可以并排显示,不会有重叠的条。这里要注意的另一个问题是,每个学校的比例尺之间要有足够的空间来放置三个条。每个bar的宽度为0.5,一共需要1.5个位置,所以在设置刻度的时候,每个刻度之间的间隔(range(0,20,2)),一共10个刻度,对应选择的10个schools,刻度间距为2,超过要求的1.5。最终效果图:图画好了,但是在画的过程中,需要心算各种位置。再加上每个bar的位置和刻度的位置,实在是太麻烦了。还有其他更简单的方法吗?羊毛布?DataFrame画图和我们熟悉的matplotlib画图对比一下。使用matplotlib绘图时,首先选择绘图函数,然后将原始数据作为参数传入函数。dataframe直接绘制的时候,类似于调用dataframe的方法。通过参数选择绘制什么样的图形。没有真正意义上的干货,用一段代码感受一下:#设置参数data2.iloc[:10]生成的图形类型。plot(x='学校',y=['语文','数学','英语'],kind="bar",figsize=(16,6),width=0.7,rot=0,title="Bar各科成绩图");一行代码就搞定了,我们先来看看效果图:要不要看看?看起来和上面matplotlib画的图差不多,但是代码简单多了。我们先看看原始dataframe长什么样:然后具体研究哪些参数影响绘图:x和y没有悬念,指定x轴和y轴的数据源,其中x的数据源是名称学校的名称,y轴是每个学科的名称学科等级种类参数控制要绘制的图形类型。这里选择的是“bar”,意思是画条形图。当然还有其他类型的折线图、饼图、柱状图等,你可以选择其他的参数,和matplotlib中的参数设置类似,个别参数会有所不同,比如设置标签字体的倾斜度。matplotlib中的参数是rotation,dataframe中的参数是rot。写法有点不同,但是效果是一样的,所以虽然没有在代码中设置倾角,但还是把这个参数写出来了。设定倾角为0度,即无倾角。下面是实现相同操作的两种方法。在实际工作中,可以根据自己的需要进行选择。堆积条形图有时候,除了看单个品类的情况,还需要同时看整体情况。这是堆叠条形图擅长的领域。plt.bar()函数用于绘制堆积柱状图和普通柱状图,堆积柱状图的绘制也是通过参数设置实现的。不熟悉参数设置的小朋友可以回到文章开头回忆一下重要参数的作用。下面是中文、数学和英文分数的堆叠条形图:plt.figure(figsize=(16,6))plt.bar(range(21),data1.loc[:,"Chinese"],width=0.9,label="中文")plt.bar(range(21),data1.loc[:,"数学"],bottom=np.array(data1.loc[:,"中文"]),width=0.9,label="数学")plt.bar(range(21),data1.loc[:,"英文"],bottom=np.array(data1.loc[:,"中文"]+data1.loc[:,"数学"]),width=0.9,label="英文")totle_score=np.array(data1.loc[:,"中文"]+data1.loc[:,"数学"]+data1.loc[:,"英文"]).astype("int")foriinrange(21):plt.text(i-0.25,totle_score[i]+1,totle_score[i])#给条形图中的每个条添加标签plt.title("各校分数叠加图",fontsize=14)plt.ylabel("年级",fontsize=14)plt.xticks(range(21),data1.iloc[:,0],rotation=30,fontsize=12)#x轴刻度为各校名plt.legend()#显示图例;原理与正面绘制三个科目的条形图相同,在sam上重复绘制ecanvas,只需要注意绘图的逻辑即可。这里是先绘制一个科目分数的竖直条形图,通过bottom参数控制绘制第二科目分数时y轴方向的第二科目分数的起始值,即绘制第二科目在topofthefirstsubjectscorebar然后把第三科成绩的bar画在第二科成绩的barbar上面,这样就形成了堆积条形图。当然还有一些细节需要付出注意。例如,三个主题栏的宽度必须设置为相同的大小,以免影响外观。细心的小朋友可能发现了一个有点新鲜的设置:多了一个函数plt.text(),这个函数的作用是在bar的最上方添加bar的label,即总分三个科目。由于我们要为每个条添加标签,因此使用循环将总分作为标签添加到图形中。通过plt.text()函数,您可以在整个图像的任何位置添加所需的文本。函数第一个参数控制文本在x轴方向的位置,第二个参数控制文本在y轴方向的位置,第三个参数是添加的文本信息。说了这么多,我们来看看堆叠条形图的效果:和常见的堆叠条形图没什么区别吧?其实条形图还是很值得深挖的,还有很多有趣的地方可以试试设置。作为预览,我计划在下一篇文章中探索不同的条形图。
