上节课我们已经把折线图的具体细节都给大家介绍的差不多了,今天来学学其他的常见图像:
柱状图
基础概述
柱状图的特点是利用柱子的高度直观反应数据的差异,辨识效果好,例如,比较一年中各季度的销售额就可以用到柱状图。
绘制柱状图的方法为:
plt.bar(x,height,width,color)
其中,x是一个列表,传递图像中x轴上显示的标签的数量和位置;height记录每个柱形的高度;width设置柱形的宽度;color设置柱形的颜色,默认为蓝色。如果我们需要设置每个柱颜色不同,可以传递一个列表,比如:[‘blue’,‘green’,‘red’]。如果柱子的数量大于传递的颜色列表数量,多出的部分会从color列表中的0号元素开始重新取值:
知道了这些,我们就尝试画一幅柱状图:
import matplotlib.pyplot as plt
high = [1.5,0.6,7.8,6]
seek=plt.bar(range(len(high)),high,width=0.3,color=['r','green'])
plt.show()
# 查看plt.bar的返回值
print(seek)
可以看到seek内容为4个BarContainer类型的对象。那么我们继续来看看这四个内容及其类型都是什么:
for i in seek:
print(i)
print(type(i))
这四个内容存储了每个柱的x,y轴坐标,宽度和高度以及旋转角度。需要注意的是,画出来的图实际上是三维图,x坐标指的是每个柱的最左端位置,而高度(height)实际上是z坐标,y则代表了每个柱的宽度。
为柱状图添加描述
下面我们做一个描述四个班男生数量的柱状图,要求为每个柱添加其代表的男生数量值,并添加图例。
在这个任务中,更改x轴标签,添加图例都和之前讲过的方式一样,下面我们讲讲怎么为柱添加高度数据。Matplot提供了一个方法:
plt.text(x,y,s,ha,va)
其中,x代表添加位置的x坐标,y代表要添加数据的高度。s代表标注的内容,ha和va分别设置水平和竖直方向的对齐方式。
需要注意一点,为柱添加标注需要逐一添加。下面我们举例讲解:
import matplotlib.pyplot as plt
man=[15,25,20,18]
female=[22,17,19,23]
rects=plt.bar(range(len(man)),man,width=0.2,label='boy',color='r')
plt.xticks(range(4),['class{}'.format(i+1) for i in range(4)]) # 修改x轴标签
plt.legend() # 添加图例
for rect in rects: # 为每个柱添加标注
'''
ret.get_x()方法可以获取rect中的x坐标
ret.get_y()可以获取rect中的y坐标
rect.get_height()可以获取rect中的height
rect.get_width()可以获取rect中的width
'''
plt.text(rect.get_x()+rect.get_width()/2,rect.get_height()+0.1,rect.get_height(),ha='center')
plt.show()
堆叠柱状图
下面我们继续把女生数量也堆叠到图中,并且给大家介绍一种在plt.bar中设置x轴标签的方法。
把柱状图堆叠到一起也非常简单,只要使用两次plt.bar即可:
import matplotlib.pyplot as plt
man=[15,25,20,18]
female=[22,17,19,23]
# 男生柱
rects=plt.bar(range(len(man)),man,width=0.2,label='boy',color='r')
h1=[]
for rect in rects: # 为每个柱添加标注
height=rect.get_height()
h1.append(height) # 储存男生柱的高度,方便找到合适的位置添加第二个柱的高度数据
plt.text(rect.get_x()+rect.get_width()/2,height/2,height,ha='center')
# 女生柱
rects=plt.bar(range(len(female)),female,bottom=man, # 设置女生柱堆叠到男生柱上方
width=0.2,label='girl',
# 添加x轴的标签,需要在最后一个plt.bar中添加:
tick_label = ['class{}'.format(i+1) for i in range(4)],color='y')
i=0
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2.0, h1[i]+(height/2.0), height, ha='center')
i+=1
plt.legend() # 添加图例
plt.show()
看看结果:
并列柱状图
想要让图片显示成并列柱的形状,只要改变plt.bar()方法中的x值就可以其他与堆叠柱状图很像:
import matplotlib.pyplot as plt
man=[15,25,20,18]
female=[22,17,19,23]
# 男生柱
rects=plt.bar(range(len(man)),man,width=0.2,label='boy',color='r') # 画男生柱状图
for rect in rects: # 为每个柱添加标注
height=rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+0.1,height,ha='center')
width=rect.get_width()
# 女生柱
x1=[i+width for i in range(len(female))]
# 画女生柱状图:
rects=plt.bar(x1,female,width=width,label='girl',
# 设置x轴的标签:
tick_label = ['class{}'.format(i+1) for i in range(4)],color='y')
for rect in rects: # 为每个柱添加标注
height = rect.get_height()
plt.text(rect.get_x()+width/2,height+0.1, height, ha='center')
plt.legend() # 添加图例
plt.show()
如果对横坐标标签位置不满意,那就还用plt.xticks()方法进行调整;如果对图片大小不满意,也可以使用上节课讲过的plt.figure()方法进行调整。
条形柱状图
条形柱状图其实就是把一张柱状图旋转一下,对应的画图方法是plt.barh():
import matplotlib.pyplot as plt
high = [1.5,0.6,7.8,6]
plt.barh(range(len(high)),high,height=0.5,color=['r','green'])
plt.show()
bar()和barh()的设置方法非常相似,但是参数名有所不同,感兴趣的小伙伴可以自己试一下。
另外,设置x,y轴的轴标题以及图像的标题,一图层多画布的设置方法都和之前一样,感兴趣的小伙伴也可以自己尝试一下~