Matplotlib绘制堆积柱形图和簇状柱形图:学生成绩的简单可视化

admin 1202

堆积柱形图

首先,导入包。

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 。