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

堆积柱形图

首先,导入包。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

导入数据并查看。

data= pd.read_csv("../data/score.csv")
data.head()

Matplotlib绘制堆积柱形图和簇状柱形图:学生成绩的简单可视化_第1张图片
可以看到,数据即不同分数段不同班级的学生人数。
先来看一下绘制效果。
Matplotlib绘制堆积柱形图和簇状柱形图:学生成绩的简单可视化_第2张图片
横坐标是分数段,纵坐标是人数,柱形中不同颜色的块表示各个班级人数占比,看上去一目了然。
那么要如何绘制呢?代码如下。

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属性。

簇状柱形图

Matplotlib绘制堆积柱形图和簇状柱形图:学生成绩的简单可视化_第3张图片
代码如下:

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 。

你可能感兴趣的:(Matplotlib绘制堆积柱形图和簇状柱形图:学生成绩的简单可视化)