使用matplotlib绘制折线图

 1 """
 2 绘制折线图:
 3 对2019年9月每日销售.xlsx绘制折线图
 4 timedelta:
 5 now = datetime.datetime.now() # 2020-06-16 15:16:37.490148
 6 print(now - datetime.timedelta(hours=3)) # 2020-06-16 12:16:37.490148
 7 print(now + datetime.timedelta(hours=-3)) # 2020-06-16 12:16:37.490148
 8 print(datetime.datetime(2018, 1, 20, 8, 14, 45, 545000)) # 2018-01-20 08:14:45.545000
 9 
10 """
11 
12 import pandas as pd
13 import matplotlib.pyplot as plt
14 import datetime
15 from datetime import timedelta
16 def plot_line():
17     #正常显示中文标签
18     plt.rcParams['font.sans-serif'] = ['SimHei']
19     #正常显示负号
20     plt.rcParams['axes.unicode_minus'] = False
21 
22     # 读取每日销售数据:表结构,日期,实际销量
23     df = pd.read_excel('./data/2019年9月每日销售.xlsx') # 默认header=0
24 
25     #定义画图的数据
26     x = df.日期
27     y = df.实际销量
28 
29     # 定义颜色
30     color1 = '#0085c3'
31     color2 = '#7ab800'
32     color3 = '#dc5034'
33 
34     # 设置图像大小
35     plt.figure(figsize=(10,8))
36     plt.subplot(111) # 增加一个子图
37 
38     # 绘制折线图
39     plt.plot(x,y,marker = 'o',color=color1,label='实际销量')
40 
41     # 标注最大值:text(x,y,s...),向(x,y)位置添加s文本
42     plt.text(x[y.idxmax()]+timedelta(hours=-12),y.max()+1,y.max(),color = color1,fontsize=15)
43     print(y.idxmax()) # y 的最大位置的索引 29
44     print(x[y.idxmax()]) # 2019-09-30 00:00:00
45     print(x[y.idxmax()]+timedelta(hours=-12)) # 2019-09-29 12:00:00
46     # print(y.max()+1) # 将文本写在最大值的上面一格
47 
48     # 标注最小值
49     plt.text(x[y.idxmin()]+timedelta(hours=-9),y.min()-1,y.min(),color=color1,fontsize=15)
50 
51     # 7天移动平均
52     y2 = y.rolling(7).mean() # 从那一天算起,往后数7天
53     # print(y2)
54 
55     # 绘制趋势线
56     plt.plot(x, y2, ls='--', color=color2, label='7 天移动平均')
57 
58     #绘制平均值线
59     plt.hlines(y.mean(), x[0], x[-1:],linestyles='-.', colors=color3)
60     # print(y.mean()) # 计算的是实际销量的平均值
61     # print(x[0]) # 2019-09-01 00:00:00
62     # print(x[-1:]) # 29   2019-09-30  29:行号,2019-09-30:日期
63 
64     # 标注平均值
65     plt.text(x[-1:]+timedelta(days=-7.5), y.mean()-2,'平均值: ' + str(round(y.mean(),1)),color=color3, fontsize=15)
66 
67     """
68     标注特殊事件:
69     annotate(s='str' ,xy=(x,y) ,xytext=(l1,l2) ,..)
70     s:注释文本内容,
71     xy:被注释的坐标点
72     xytext:注释文字的坐标位置 
73     """
74     plt.annotate('中秋节', xy=(x[y.idxmin()], y.min()), color=color1,
75      xytext=(x[y.idxmin()]+timedelta(days=1.5), y.min()-2),
76      arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)
77     plt.annotate('打折促销', xy=(x[y.idxmax()], y.max()), color=color1,
78      xytext=(x[y.idxmax()]+timedelta(days=-5), y.max()+2),
79      arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)
80 
81     # 设置⽹格线
82     plt.grid(ls=':', color='gray', alpha=0.6)
83 
84     # 设置图例的位置和⼤⼩
85     plt.legend(loc='upper left', fontsize=12)
86 
87     # 设置坐标轴标签的⻆度和⼤⼩
88     plt.xticks(rotation=90, fontsize=12) # x轴的标签,竖着显示,如果加入参数x,将每点的x坐标都显示出来
89     plt.yticks(fontsize=12)
90 
91     # 设置 y 轴的刻度范围
92     plt.ylim(0, y.max()+5)
93 
94     plt.title('2019年9月每日销售变化趋势', fontsize=25) # 添加标题
95     plt.show() # 将图显示出来
96 
97 
98 if __name__ == '__main__':
99     plot_line()

结果:

部分数据展示如下:

 

 

原文地址:https://www.cnblogs.com/shuangcao/p/13141286.html