首先,导入包。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
导入数据并查看。
data= pd.read_csv("../data/score.csv")
data.head()
可以看到,数据即不同分数段不同班级的学生人数。
先来看一下绘制效果。
横坐标是分数段,纵坐标是人数,柱形中不同颜色的块表示各个班级人数占比,看上去一目了然。
那么要如何绘制呢?代码如下。
fig, ax = plt.subplots(figsize=(10,6))
ax.bar(data['score'], data['class 4'], width, label='class 4')
ax.bar(data['score'], data['class 5'], width, bottom=data['class 4'],label='class 5')
ax.bar(data['score'], data['class 6'], width, bottom=data['class 4']+data['class 5'],label='class 6')
ax.set_ylabel('Number')
ax.set_title('Scores by group and class')
ax.legend()
plt.xticks(rotation=300)
plt.show()
这里采用的是面向对象的绘制方法,先利用plt.subplots()显式地创建图形和轴,再添加其他元素。
堆积柱形图绘制的关键点在于bar的bottom属性,即柱形的底(的高度)。就上文数据而言,class 5的底应为class 4的高度,class 6 的底即class 4和class 5的高度之和。
另外,为了方便显示,我们对横坐标进行旋转,利用的是xticks中的rotation属性。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
labels=['class 4', 'class 5', 'class 6']
data = pd.DataFrame({'girl': [352, 350, 339], 'boy': [333, 345, 343]},
index=labels)
x = np.arange(len(labels)) # the label locations
width = 0.25 # the width of the bars
fig, ax = plt.subplots(figsize=(5,4))
rects1 = ax.bar(x - width/2, data['girl'], width, label='girl')
rects2 = ax.bar(x + width/2, data['boy'], width, label='boy')
# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x)
ax.set(ylim=(300, 370))
ax.set_xticklabels(labels)
ax.legend()
画簇状柱形图的关键在于修改bar的横坐标,中心点为x,代表第一类的矩形向左偏移width/2,代表第二类的矩形向右偏移width/2。
添加标注
def autolabel(rects):
"""Attach a text label above each bar in *rects*, displaying its height."""
for rect in rects:
height = rect.get_height()
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
fig.tight_layout()
plt.show()
xy为需要添加标注的坐标点,xytext为标注文本的坐标点,默认与xy相同。(0,3)代表向上偏移3个单位。textcoords = ‘offset points’ 表示 以上述被标注的点(x,y)为计算xytext 绝对坐标的起点。ha va=’ center’ 表示点在注释的中心。ha 水平放置方式有right 、left 和center, va 垂直放置方式有 top、center和 bottom 。