python用matplotlib绘制并列双柱状图并标注数值

项目场景:

Python项目需要画两组数据的双柱状图,以下以一周七天两位小朋友吃糖颗数为例进行演示,用matplotlib库实现


代码:

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

def drawHistogram():
    matplotlib.rc("font", family='MicroSoft YaHei')
    list1 = np.array([5, 2, 1, 0, 8, 0, 6])   # 柱状图第一组数据
    list2 = np.array([9, 5, 1, 2, 9, 2, 0])   # 柱状图第二组数据
    length = len(list1)
    x = np.arange(length)   # 横坐标范围
    listDate = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"]

    plt.figure()
    total_width, n = 0.8, 2   # 柱状图总宽度,有几组数据
    width = total_width / n   # 单个柱状图的宽度
    x1 = x - width / 2   # 第一组数据柱状图横坐标起始位置
    x2 = x1 + width   # 第二组数据柱状图横坐标起始位置

    plt.title("一周每天吃悠哈软糖颗数柱状图")   # 柱状图标题
    # plt.xlabel("星期")   # 横坐标label 此处可以不添加
    plt.ylabel("吃悠哈软糖颗数(个)")   # 纵坐标label
    plt.bar(x1, list1, width=width, label="小s吃糖数")
    plt.bar(x2, list2, width=width, label="小y吃糖数")
    plt.xticks(x, listDate)   # 用星期几替换横坐标x的值
    plt.legend()   # 给出图例
    plt.show()

if __name__ == '__main__':
    drawHistogram()

效果图:

python用matplotlib绘制并列双柱状图并标注数值_第1张图片

扩展功能及代码:

扩展功能一
如果横坐标标签比较长或是文字比较多,以一定角度倾斜展示,上文中代码这一行:

plt.xticks(x, listDate)

可以改为:

plt.xticks(x, listDate, rotation=30)   # rotation为标签旋转角度

横坐标标签旋转30°效果如下:
python用matplotlib绘制并列双柱状图并标注数值_第2张图片

横坐标标签旋转90°效果如下:
python用matplotlib绘制并列双柱状图并标注数值_第3张图片

扩展功能二
如果希望具体的数据值展示在柱状图中,可以在代码 plt.legend() 前加入如下代码:

for a, b in zip(x1, list1):
	plt.text(a, b + 0.1, '%.0f' % b, ha='center', va='bottom', fontsize=7)

for a, b in zip(x2, list2):
	plt.text(a, b + 0.1, '%.0f' % b, ha='center', va='bottom', fontsize=7)

加了具体数值的柱状图效果如下:
python用matplotlib绘制并列双柱状图并标注数值_第4张图片


后续有时间再继续补充扩展功能哦~

你可能感兴趣的:(python,matplotlib,numpy,plot)