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()
结果:
部分数据展示如下: