跳至主要內容

目录

2023年9月15日大约 26 分钟

目录


Matplotlib




pyplot


pyplot绘图的基本操作

pyplot绘图的基本操作备用链接


创建画布与创建子图

函数函数作用
plt.figure()创建一个空白画布,可以指定画布大小,像素
plt.subplot()创建并选中子图,可以指定子图的行数,列数,与选中图片编号
matplotlib.pyplot def figure(num: Union[int, str, None] = None,
           figsize: Any = None,
           dpi: Optional[int] = None,
           facecolor: Any = None,
           edgecolor: Any = None,
           frameon: Optional[bool] = True,
           FigureClass: Any = Figure,
           clear: Optional[bool] = False,
           **kwargs: Any) -> Any

注意:当你使用画布时,务必记得在不使用该画布时使用 pyplot.close 来关闭画布以清理其占用的内存

  • 否则你可能会因为内存溢出而头痛不已
import matplotlib.pyplot as plt
import numpy as np

a = np.arange(1, 13)
b = np.array([12, 12, 34, 23, 56, 45, 24, 45, 23, 45, 21, 12])
c = a ** 2 + 1
plt.figure('qwqerr', figsize=(10, 5), dpi=60)  # 定义画布
plt.plot(a, b)
plt.figure('12', figsize=(10, 5), dpi=60)
plt.plot(a, c)
plt.show()


添加图的基本要素


函数函数作用
plt.title在当前图形中添加图表题,可以确定标题的名称,位置,颜色,字体大小等参数
plt.xlable在当前图形中添加x轴名称(标题),可以指定位置,颜色,字体大小等参数
plt.ylable在当前图形中添加y轴名称(标题),可以指定位置,颜色,字体大小等参数
plt.xlim指定当前x轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.ylim指定当前y轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.xticks指定x轴可读的数目与取值
plt.yticks指定y轴可读的书目与取值

rcParams参数


正常显示中文和负号

Matplotlib内无中文字节码,需要另外添加显示中文的模块

from matplotlib.font_manager import FontProperties as FP
font = FP(fname = 'C:/WINDOWS/Fonts/STKAITI.TTF', size=16)
matplotlib.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

例子:绘制sin(x)sin(x)

绘制sin(x) ,并添加标题


title('文本',fontsize=None,fontweight=None,fontstyle=None) 

1.使用字体管理器font_manager
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties as FP

font = FP(fname='C:/WINDOWS/Fonts/STKAITI.TTF', size=12)
a1 = np.linspace(0, 2 * np.pi)
b1 = np.sin(a1)
plt.title('sin(x)函数图', fontproperties=font, size=18)  # 设置图的标题
plt.xlabel('x轴', fontproperties=font)  # 设置X轴的名称
plt.ylabel('y轴', fontproperties=font)  # 设置y轴的名称
plt.plot(a1, b1)  # 画折线图
plt.show()


为不同标题(图、坐标轴)设置不同的字体,大小,采用字体管理器
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import fontManager

a1 = np.linspace(0, 2 * np.pi)
b1 = np.sin(a1)
plt.title('sin(x)函数图', fontproperties='FangSong', size=16)  # 设置图的标题
plt.xlabel('x值', fontproperties='simhei', fontsize=10)  # 设置X轴的名称
plt.ylabel('函数值', fontproperties='stkaiti')  # 设置y轴的名称
plt.plot(a1, b1)  # 画折线图
plt.show()


显示图中的负号

虽然这里这么写了,但是在字体管理器那里我已经可以正常显示负号了


import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
a1 = np.linspace(0, 2 * np.pi)
b1 = np.sin(a1)
plt.title('sin(x)函数图', fontsize='large')  # 设置图的标题
plt.xlabel('x的值')    # 设置X轴的名称
plt.ylabel('函数值')   # 设置y轴的名称
plt.plot(a1, b1)      # 画折线图
plt.show()

# 运行结果
C:\Users\233\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_agg.py:214: RuntimeWarning: Glyph 8722 missing from current font.
  font.set_text(s, 0.0, flags=flags)
C:\Users\233\AppData\Local\Programs\Python\Python38\lib\site-packages\matplotlib\backends\backend_agg.py:183: RuntimeWarning: Glyph 8722 missing from current font.
  font.set_text(s, 0, flags=flags)


绘制sin(x),cos(x)
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
plt.plot(a1, b1)
plt.plot(a1, c1)
plt.title('sin---cos 曲线图')
plt.show()


import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
d1 = 2 * a1 + 4
fig = plt.figure(figsize=(12, 4))  # 定义了图对象
fig.add_subplot(2, 2, 1)  # fig.add_subplot(221)
plt.plot(a1, b1)
fig.add_subplot(2, 2, 2)
plt.plot(a1, c1)
fig.add_subplot(223)
plt.plot(a1, d1)
plt.show()


import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
d1 = 2 * a1 + 4
fig = plt.figure(figsize=(12, 4))  # 定义了图对象
fig.add_subplot(2, 2, 1)  # fig.add_subplot(221)
plt.title('sin(x)')
plt.plot(a1, b1)
fig.add_subplot(2, 2, 2)
plt.title('cos(x)')
plt.plot(a1, c1)
fig.add_subplot(223)
plt.title('直线')
plt.plot(a1, d1)
plt.show()


import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
d1 = 2 * a1 + 4
e1 = a1 ** 2 + 4 * a1 + 3
plt.figure(figsize=(8, 4))  # 创建画布
plt.suptitle('Figuer 标题', fontsize=14)

plt.subplot(2, 2, 1)  # plt.subplot(221)
plt.title('sin(x)')
plt.plot(a1, b1)

plt.subplot(2, 2, 2)
plt.title('cos(x)')
plt.plot(a1, c1)

plt.subplot(223)
plt.title('直线')
plt.plot(a1, d1)

plt.subplot(224)
plt.title('二次函数')
plt.plot(a1, e1)
plt.tight_layout(1, 3, 3)
plt.show()


例题:烧烤店营业额折线图

| 月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | | ---- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- || | 营业额(万元) | 5.2 | 4 | 3.7 | 5.2 | 4.9 | 3.6 | 5.8 | 3.8 | 6.7 | 6.1 | 4.5 | 5.7 |

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['simhei']
a = list(range(1, 13))
b = [5.2, 4, 3.7, 5.2, 4.9, 3.6, 5.8, 3.8, 6.7, 6.1, 4.5, 5.7]
plt.title('烧烤店营业额')
plt.xlabel('月')
plt.ylabel('营\n业\n额', rotation=0, labelpad=20)
xnum = range(1, 13)
xlabel = [str(i) + '月' for i in range(1, 13)]
plt.xticks(xnum, xlabel)  # 设置x轴的刻度与标签
plt.plot(a, b)
plt.show()


legend.loc参数


设置图例


legend的主要参数如下:


例1:给三角函数图加图例
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
plt.title('sin---cos 曲线图')
plt.plot(a1, c1)
plt.plot(a1, b1)
plt.legend(['cosx', 'sinx'], loc=3) # loc=3对应lower left
plt.show()


给四个子图分别添加图例
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
d1 = 2 * a1 + 4
e1 = a1 ** 2 + 4 * a1 + 3

plt.figure(figsize=(8, 4))  # 创建画布
plt.suptitle('Figuer 标题', fontsize=14)

plt.subplot(2, 2, 1)  # plt.subplot(221)
plt.title('sin(x)')
plt.plot(a1, b1)
plt.legend(['sinx'])
plt.subplot(2, 2, 2)
plt.title('coswe')
plt.plot(a1, c1)
plt.legend(['cosx'])
plt.subplot(223)
plt.title('直线')
plt.plot(a1, d1)
plt.legend(['straight lines'], edgecolor='r')
plt.subplot(224)
plt.title('二次函数')
plt.plot(a1, e1)
plt.tight_layout(1, 3, 3)
plt.show()


保存与显示图


保存:

实例
import matplotlib.pyplot as plt
import numpy as np
import os

file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '123.png'))

plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
a1 = np.linspace(-2 * np.pi, 2 * np.pi)
b1 = np.sin(a1)
c1 = np.cos(a1)
d1 = 2 * a1 + 4
e1 = a1 ** 2 + 4 * a1 + 3
plt.figure(figsize=(8, 4))  # 创建画布
plt.suptitle('Figuer 标题', fontsize=14)

plt.subplot(2, 2, 1)  # plt.subplot(221)
plt.title('sin(x)')
plt.plot(a1, b1)
plt.legend(['sinx'])
plt.subplot(2, 2, 2)
plt.title('coswe')
plt.plot(a1, c1)
plt.legend(['cosx'])
plt.subplot(223)
plt.title('直线')
plt.plot(a1, d1)
plt.legend(['straight lines'], edgecolor='r')
plt.subplot(224)
plt.title('二次函数')
plt.plot(a1, e1)
plt.tight_layout(1, 3, 3)

# 图的保存
plt.savefig(file_path)
plt.show()


显示

折线图:plot()实例


例1 商场优惠

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['simhei']
# 购买数量数据存储
num = np.array(range(1, 31))
# 购买数量对应的优惠价
price = 75
wnum = np.array([price * (1 - 0.01 * i) for i in num])
# 商家收益数据
earnnum = (wnum - 49) * num
# 顾客总消费
cusprice = wnum * num
# 顾客省钱
cusnum = num * (price - wnum)
plt.xlabel('顾客购买数量(件) ')
plt.ylabel('金额(元) ')
plt.plot(num, earnnum)
plt.plot(num, cusprice)
plt.plot(num, cusnum)
plt.title('数量--金额关系图')
plt.legend(['商家收益', '顾客总消费', '顾客省钱'])
plt.show()


修改线的形状
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['simhei']
num = np.array(range(1, 31))  # 购买数量数据存储
# 购买数量对应的优惠价
price = 75
wnum = np.array([price * (1 - 0.01 * i) for i in num])
earnnum = (wnum - 49) * num  # 商家收益数据
cusprice = wnum * num  # 顾客总消费
cusnum = num * (price - wnum)  # 顾客省钱
plt.xlabel('顾客购买数量(件) ')
plt.ylabel('金额(元) ')
plt.plot(num, earnnum, '--', label='商家收益')
plt.plot(num, cusprice, label='顾客总消费')
plt.plot(num, cusnum, ':', label='顾客省钱')
plt.title('数量--金额关系图')

plt.legend()
plt.show()


散点图实战


例1:折线图重绘为散点图


例2:商场信号强度


例3:商场优惠折线图散点图结合

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['simhei']
num = np.array(range(1, 31))  # 购买数量数据存储
# 购买数量对应的优惠价
price = 75
wnum = np.array([price * (1 - 0.01 * i) for i in num])
earnnum = (wnum - 49) * num  # 商家收益数据
cusprice = wnum * num  # 顾客总消费
cusnum = num * (price - wnum)  # 顾客省钱
plt.xlabel('顾客购买数量(件) ')
plt.ylabel('金额(元) ')
plt.plot(num, earnnum, '--', label='商家收益')
plt.plot(num, cusprice, label='顾客总消费')
plt.plot(num, cusnum, ':', label='顾客省钱')
plt.title('数量--金额关系图')
# 求商场收益的最大值
maxearn = max(earnnum)
# 求商场收益最大值在earnnum中的位置。采用列表求索引的方法
pos = list(earnnum).index(maxearn)
# 用散点图标出商场收益的最大值
plt.scatter(pos + 1, maxearn, marker='*', color='r', s=240)
plt.legend()
plt.show()


标注数字

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.family'] = ['simhei']
num = np.array(range(1, 31))    # 购买数量数据存储
# 购买数量对应的优惠价
price = 75
wnum = np.array([price * (1 - 0.01 * i) for i in num])
earnnum = (wnum - 49) * num     # 商家收益数据
cusprice = wnum * num           # 顾客总消费
cusnum = num * (price - wnum)   # 顾客省钱
plt.xlabel('顾客购买数量(件) ')
plt.ylabel('金额(元) ')
plt.plot(num, earnnum, '--', label='商家收益')
plt.plot(num, cusprice, label='顾客总消费')
plt.plot(num, cusnum, ':', label='顾客省钱')
plt.title('数量--金额关系图')
# 求商场收益的最大值
maxearn = max(earnnum)
# 求商场收益最大值在earnnum中的位置。采用列表求索引的方法
pos = list(earnnum).index(maxearn)
# 用散点图标出商场收益的最大值
plt.scatter(pos + 1, maxearn, marker='*', color='r', s=240)
plt.annotate(maxearn, xy=(pos + 1, maxearn + 40),
             xytext=(pos, maxearn + 300),
             arrowprops=dict(facecolor='blue',
                             shrink=5,
                             )
             )
plt.legend()
plt.show()


Matplotlib数据可视化


数据可视化的误区


可视化方式


趋势


示例:商场部门业绩
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
food_d = [60, 40, 46, 50, 57, 76, 70, 33, 70, 61, 49, 45]
cos_d = [110, 75, 133, 80, 83, 95, 87, 89, 96, 88, 86, 89]
gold_d = [143, 100, 89, 90, 78, 129, 100, 97, 108, 152, 96, 87]

mo = [str(i) + '月' for i in range(1, 13)]

plt.figure(figsize=(10, 5))
plt.title('某商场各部门业绩(万元) ')
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
# 绘制折线
plt.plot(month, food_d, linestyle='--', color='blue')
plt.plot(month, man_d, color='r')
plt.plot(month, woman_d, color='c', linestyle=':')
plt.plot(month, cos_d, color='y')
plt.plot(month, gold_d, linestyle='-.')
# 添加图例
plt.legend(['餐饮', '男装', '女装', '化妆品', '金银首饰'])

plt.show()


对比


示例:商场男女装销售对比
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
mo = [str(i) + '月' for i in range(1, 13)]
plt.figure(figsize=(10, 5))
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
plt.bar(month, man_d, 0.8, color='#FF00FF', label='男装', )
plt.bar(month, woman_d, color='lightskyblue', label='女装')
plt.title('某商场各部门业绩(万元) ')
plt.legend()
plt.show()


图形美化-"倒影"柱状图
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
# 为了方便取每个数的负数,womana_d转换为数组
woman_d = np.array([70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60])
mo = [str(i) + '月' for i in range(1, 13)]
plt.figure(figsize=(10, 5))
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
plt.bar(month, man_d, 0.8, color='#FF00FF', label='男装', )
plt.bar(month, -woman_d, color='lightskyblue', label='女装')
plt.title('某商场各部门业绩(万元) ')
plt.legend()
plt.show()


美化-并列柱状图
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
mo = [str(i) + '月' for i in range(1, 13)]
plt.figure(figsize=(10, 5))
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
plt.bar(month - 0.4, man_d, 0.4, color='#FF00FF', label='男装', )
plt.bar(month, woman_d, 0.4, color='lightskyblue', label='女装')
plt.title('某商场各部门业绩(万元) ')
plt.legend()
plt.show()


美化:添加注释文字
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
mo = [str(i) + '月' for i in range(1, 13)]
plt.figure(figsize=(10, 5))
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
plt.bar(month - 0.4, man_d, 0.4, color='#FF00FF', label='男装', )
plt.bar(month, woman_d, 0.4, color='lightskyblue', label='女装')
plt.title('某商场各部门业绩(万元) ')
plt.legend()

for i, j in zip(month, man_d):
    plt.text(i - 0.4, j/2, j, ha='center')
    # i-0.4 :文字起始(左边沿)横坐标
    # j/2 :文字起始(下边沿)纵坐标
    # ha = 'center' : i-0.4作为文字的横向中点,文字均匀分布在i-0.4两侧
    # j : 待绘制的文字/数值


for i, j in zip(month, woman_d):
    plt.text(i - 0.1, j - 10, j)
plt.show()


示例2:商场各部门业绩
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
re_d = [60, 40, 46, 50, 57, 76, 70, 33, 70, 61, 49, 45]
hua_d = [110, 75, 133, 80, 83, 95, 87, 89, 96, 88, 86, 89]
gl_d = [143, 100, 89, 90, 78, 129, 100, 97, 108, 152, 96, 87]
mo = [str(i) + '月' for i in range(1, 13)]
plt.figure(figsize=(10, 5))
plt.xticks(month, mo)
plt.xlabel('月份')
plt.ylabel('营业额(万元) ', labelpad=12)
plt.bar(month - 0.1, re_d, 0.1)
plt.bar(month, man_d, 0.1, color='r')
plt.bar(month + 0.1, woman_d, 0.1, color='b')
plt.bar(month + 0.2, hua_d, 0.1)
plt.bar(month + 0.3, gl_d, 0.1)
plt.title('某商场各部门业绩(万元) ')
plt.legend(['餐饮', '男装', '女装', '化妆品', '金银首饰'])
plt.show()


转化:条形图:barh()
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['simhei']
# 数据存储
month = np.array(range(1, 13))  # 存储月份
man_d = [51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
woman_d = [70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
re_d = [60, 40, 46, 50, 57, 76, 70, 33, 70, 61, 49, 45]
hua_d = [110, 75, 133, 80, 83, 95, 87, 89, 96, 88, 86, 89]
gl_d = [143, 100, 89, 90, 78, 129, 100, 97, 108, 152, 96, 87]
mo = [str(i) + '月' for i in range(1, 13)]

plt.figure(figsize=(10, 6))
plt.ylim(0, 13)
plt.yticks(month, mo)
plt.ylabel('月份')
plt.xlabel('营业额(万元) ', labelpad=12)
plt.barh(month - 0.2, re_d, 0.2, color='pink')
plt.barh(month, man_d, 0.2, color='r')
plt.barh(month + 0.2, woman_d, 0.2, color='c')
plt.barh(month + 0.4, hua_d, 0.2, color='yellow')
plt.barh(month + 0.6, gl_d, 0.2, color='blue')
plt.title('某商场各部门业绩(万元) ')
plt.legend(['餐饮', '男装', '女装', '化妆品', '金银首饰'])
plt.show()


结构


示例1:成绩分段
import matplotlib.pyplot as plt
import random

plt.rcParams['font.family'] = ['simhei']
# random.seed(30)
# 随机生成30位学生的考试成绩
stu_s = [random.randint(40, 100) for i in range(30)]
grade = {'0-49': 0,
         '50-59': 0,
         '60-69': 0,
         '70-79': 0,
         '80-89': 0,
         '90-100': 0}

plt.figure(figsize=(10, 6))
plt.title('学生成绩分段统计图')
plt.ylabel('学生成绩分段人数')
plt.xlabel('分数段')

for i in stu_s:
    if i <= 49:
        s = '0-49'
        grade[s] = grade.get(s, 0) + 1
    elif i <= 59:
        s = '50-59'
        grade[s] = grade.get(s, 0) + 1
    elif i <= 69:
        s = '60-69'
        grade[s] = grade.get(s, 0) + 1
    elif i <= 79:
        s = '70-79'
        grade[s] = grade.get(s, 0) + 1
    elif i <= 89:
        s = '80-89'
        grade[s] = grade.get(s, 0) + 1
    else:
        s = '90-100'
        grade[s] = grade.get(s, 0) + 1

gr1_name = list()
gr1_data = list()
for i in grade:
    gr1_name.append(i)
    gr1_data.append(grade[i])
gr1 = range(len(gr1_name))
plt.xticks(gr1, gr1_name)
plt.bar(gr1_name, gr1_data, 0.6, color='c')
for x, y in zip(gr1_name, gr1_data):
    plt.text(x, y + 0.1, str(y))

plt.show()