上篇文章简单介绍了用matplotlib绘制折线图的方法,本篇文章继续为大家带来条形图的绘制。不同类型的图形有着不同的应用场景,请读者在使用过程中感受不同图形的特点。“纸上得来终觉浅,绝知此事要躬行”,matplotlib绘图看起来很简单,但在实际操作中还是会碰到各种各样的问题,亲自动手编写代码并逐一解决问题能有效加深对知识的理解。
简单的条形图
条形图是用宽度相同的条形的高度或长短来表示数据多少的图形,不仅能表示出数据的大小,还能直观地比较数据的差别。根据条形方向的不同,条形图可以分为垂直条形图和水平条形图,我们先以垂直条形图为例。绘制水平条形图有两个必须的参数,条形位置和条形高度,前者表示条形在x轴上的位置,后者表示数据值的大小。下面我们来绘制一个简单的条形图。
条形图的绘制步骤与折线图基本一致,首先创建画板和子图,然后传入条形高度和条形位置参数,并自定义标签、刻度、图例,最后展示图形。注意bar函数中第3个参数0.5表示条形的宽度,如果不写的话将使用缺省值1。通过上面简单的示例,相信读者对条形图已经有了最直观的认识,接下来我们可以绘制更复杂的条形图了。“fandango_scores.csv”数据集记录了国外电影评分网站对146部电影的评分情况,下面我们通过绘制条形图来看看不同网站对第1部电影“avengers: age of ultron (2015)”的评分有什么不同。
绘图的过程与上面的例子没什么不同,只是完善了坐标轴的刻度、标签和图形标题等信息。 需要注意的是:x轴刻度要与条形位置相对应,因此需要使用set_xticks函数将x轴的刻度与条形位置保持一致。绘制后的条形图如下所示:
簇状条形图和堆积状条形图
上文条形图的绘制都是先将dataframe中的数据提取出来封装成ndarray格式(heights和positions),然后都是用把ndarray数据传入bar函数,并自定义各种属性,完成绘制,过程虽然逻辑清楚但稍显繁琐。事实上series和dataframe自带生成图标的方法,来一起了解一下。
仍然以电影评分的数据集为例,对于同一个评分网站(如烂番茄:rottentomatoes),既有网站官方评分,也有网站用户评分,如果我们想要对比一下同一部电影两个评分有什么差别,该怎么做呢?我们可以绘制簇状条形图,将每个电影的网站官方评分和网站用户评分放在一起对比。
dataframe中绘制簇状条形图,会自动把索引当做刻度,在每个刻度上对该索引对应的多个数据进行绘制,并把列名当做图例。我们只需要使用set_index函数将索引修改为电影名即可,为了让图形更加美观,我们绘制水平条形图,最后的效果如下图。
假设某班组织期末考试,共有chinese和math两门课,现在要将学生的单门课成绩和总成绩在一幅图中进行展示,我们就需要用到堆积状条形图。绘制方法也很简单,只需要在bar方法中注明stacked=true。
用matplotlib绘制簇状条形图和堆积条形图当然也是可以的,只不过代码写起来要繁琐得多,我们要手动定义每个条形的位置和颜色(网盘源码中为读者提供了参考代码)。series和dataframe中将绘图方法做很好的封装,用户只需要按照规定的格式提供数据就行,matplotlib的绘图方法虽然相对繁琐,但是自由度更高,可定制性更强。读者在实际绘图过程中,可以根据自己的需求选择实现方式。本文使用ide为jupyter notebook,下载源码及数据源请移步。网盘资源汇总(永久有效,定期更新)