柱状图又被称为柱形图、长条图、条状图或棒形图,是一种以长方形的长度为变量的统计图表。在现实应用中,经常使用柱状图来展示数据分析的结果,这样可以更加直观的展示数据分析结果。在本节的内容中,将详细讲解使用Python绘制柱状图的知识。
4.1 绘制基本的柱状图
在数据可视化分析工作中,经常需要绘制和数据统计相关的柱状图。在本节的内容中,将详细讲解在Python程序中使用各种库绘基本柱状图的知识。
4.1.1 绘制只有一个柱子的柱状图
在Python程序中,可以使用Matplotlib很容易地绘制一个柱状图。例如在线的实例文件bar01.py中,只需使用3行代码就可以绘制一个简单地柱状图。
源码路径:codes\4\4-1\bar01.py
import matplotlib.pyplot as plt
plt.bar(x = 0,height = 1)
plt.show()
在上述代码中,首先使用import导入了matplotlib.pyplot ,然后直接调用其bar()函数绘柱状图,最后用show()函数显示图像。其中在函数bar()中存在如下两个参数。
- left:柱形的左边缘的位置,如果指定为1,那么当前柱形的左边缘的x值就是1.0。
- height:这是柱形的高度,也就是y轴的值。
执行上述代码后会绘制一个柱状图,如图4-1所示。
图4-1 执行效果
4.1.2 绘制有两个柱子的柱状图
虽然通过上述代码绘制了一个柱状图,但是现实效果不够直观。在绘制函数bar()中,参数x和height除了可以使用单独的值(此时是一个柱形)外,还可以使用元组来替换(此时代表多个矩形)。例如在下面的实例文件bar02.py中,演示了使用matplotlib绘制有两个柱子的柱状图的过程。
源码路径:codes\4\4-1\bar02.py
import matplotlib.pyplot as plt #导入模块
plt.bar(x = (0,1),height = (1,0.5)) #绘制两个柱形图
plt.show() #显示绘制的图
执行效果如图4-2所示。
图4-2 执行效果
在上述实例代码中,x = (0,1)的意思是总共有两个矩形,其中第一个的左边缘为0,第二个的左边缘为1。参数height的含义也是同理。当然,此时有的读者可能觉得这两个矩形“太宽”了,不够美观。此时可以通过指定函数bar()中的width参数来设置它们的宽度。请看下面的实例文件bar03.py,功能是设置柱子的宽度width为0.35。
源码路径:codes\4\4-1\bar03.py
import matplotlib.pyplot as plt
plt.bar(x = (0,1),height = (1,0.5),width = 0.35)
plt.show()
执行效果如图4-3所示
图4-3 设置柱状图宽度
4.1.3 设置柱状图的标签
这时可能有的读者会问:需要标明x和y轴的说明信息,比如使用x轴表示性别,使用y轴表示人数。例如在下面的实例文件bar04.py中,演示了使用库matplotlib绘制有说明信息柱状图的过程。
源码路径:codes\4\4-1\bar04.py
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体
mpl.rcParams['axes.unicode_minus'] = False #解决保存图像时负号'-'显示为方块的问题
plt.xlabel(u'性别') #x轴的说明信息
plt.ylabel(u'人数') #y轴的说明信息
plt.bar(x = (0,1),height = (1,0.5),width = 0.35)
plt.show()
上述代码执行后的效果如图4-4所示。
图4-4 执行效果
接下来可以对x轴上的每个bar进行说明,例如设置第一个柱状图是“男”,第二个柱状图是“女”。此时可以通过如下实例文件bar05.py实现。
源码路径:codes\4\4-1\bar05.py
plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.xticks((0,1),(u'男',u'女'))
plt.bar(x = (0,1),height = (1,0.5),width = 0.35)
plt.show()
在上述代码中,函数plt.xticks()的用法和前面使用的x和height的用法差不多。如果你有几个bar,那么就对应几维的元组,其中第一个参数表示文字的位置,第二个参数表示具体的文字说明。不过这里有个问题,例如有时我们指定的位置有些“偏移”,最理想的状态应该在每个矩形的中间。我们可以通过直接指定函数bar()里面的align="center"就可以让文字居中了。
plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.xticks((0,1),(u'男',u'女'))
plt.bar(x = (0,1),height = (1,0.5),width = 0.35,align="center")
plt.show()
此时的执行效果如图4-5所示。
图4-5 执行效果
接下来可以通过如下代码给柱状图表加入一个标题。
plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.title(u"性别比例分析")
plt.xticks((0,1),(u'男',u'女'))
rect = plt.bar(left = (0,1),height = (1,0.5),width = 0.35,align="center")
plt.legend((rect,),(u"图例",))
plt.show()
在上述代码中用到了函数legend(),里面的参数必须是元组。即使只有一个图例也必须是元组,否则显示不正确。此时的执行效果如图4-6所示。
图4-6 执行效果
接下来还可以在每个矩形的上面标注对应的y值,此时需要使用如下通用的方法实现。
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2., 1.03*height, '%s' % float(height))
在上述实例代码中,其中plt.text有三个参数,分别是:x坐标,y坐标,要显示的文字。调用函数autolabel()的具体实现代码如下所示。
autolabel(rect)
为了避免绘制矩形柱状图紧靠着顶部,最好能够空出一段距离,此时可以通过函数bar()的属性参数yerr来设置。一旦设置了这个参数,那么对应的矩形上面就会有一个竖着的线。当把yerr这个值设置得很小的时候,上面的空白就自动空出来了。
rect = plt.bar(left = (0,1),height = (1,0.5),width = 0.35,align="center",yerr=0.0001)
到此为止,一个比较美观的柱状图绘制完毕,将代码整理并保存在如下实例文件bar06.py中,具体实现代码如下所示。
源码路径:codes\4\4-1\bar06.py
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体
mpl.rcParams['axes.unicode_minus'] = False #解决保存图像时负号'-'显示为方块的问题
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2., 1.03*height, '%s' % float(height))
plt.xlabel(u'性别')
plt.ylabel(u'人数')
plt.title(u"性别比例分析")
plt.xticks((0,1),(u'男',u'女'))
#绘制柱形图
rect = plt.bar(x = (0,1),height = (1,0.5),width = 0.35,align="center",yerr=0.0001)
plt.legend((rect,),(u"图例",))
autolabel(rect)
plt.show()
上述代码执行后的效果如图4-7所示。
图4-7 执行效果
4.1.4 设置柱状图的颜色
请看下面的实例文件bar06-1.py,功能是使用库matplotlib绘制绿颜色的柱状图。
源码路径:codes\4\4-1\bar06-1.py
import matplotlib.pyplot as plt
data = [5, 20, 15, 25, 10]
plt.bar(range(len(data)), data, fc='g')
plt.show()
执行效果如图4-8所示。
图4-8 执行效果
请看下面的实例文件bar06-2.py,功能是使用库matplotlib绘制不同颜色的柱状图。
源码路径:codes\4\4-1\bar06-2.py
import matplotlib.pyplot as plt
data = [5, 20, 15, 25, 10]
plt.bar(range(len(data)), data, color='rgb') # or `color=['r', 'g', 'b']`
plt.show()
执行效果如图4-9所示。
图4-9 执行效果