zoukankan      html  css  js  c++  java
  • 使用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()

    结果:

    部分数据展示如下:

     

     

  • 相关阅读:
    如何创建支持Eclipse IDE的Maven项目
    使用Nexus搭建Maven私服
    Maven找不到java编译器的问题
    关于java -version版本问题
    win7右下角声音图标不见的解决方法
    如何用Maven创建一个普通Java项目
    如何手动把jar包添加进Maven本地仓库
    Maven是如何工作的
    Maven远程仓库
    canvas+js实现时钟效果图
  • 原文地址:https://www.cnblogs.com/shuangcao/p/13141286.html
Copyright © 2011-2022 走看看