说起折线图,很多人都觉得非常简单,不就是一些点连成的线吗?用 Excel 几秒钟就能画出一张折线图。

真的就这么简单吗?

想一想:在普通的折线图中,如何自动地添加一条代表平均值的横线?如何添加一条带箭头的趋势线?如何快速地标注最大值和最小值?如何标注特殊事件?如何对折线图进行数据分析?

下面我们用一个具体的案例,演示折线图的分析过程和画图的方法。

一个案例

根据某公司 2019 年 9 月份每天的销量数据,画出如下一张折线图:

通过观察可以看到,销量每隔几天就有一个波谷,对照日历,发现一个规律:这些销量比较低的日期,都是周末或节假日。

如果理解了业务的周期性,那么在分析数据时,就能排除一些干扰,更快地找到对业务真正有价值的信息。

排除周期性的因素之后,我们观察折线图中的最大值和最小值,看看它们是否在正常范围以内,如果不是的话,那么要分析背后的原因。

比如说,9 月 30 日的销量最高,明显高于平时的正常水平,经过与业务沟通和分析发现,是因为这一天做了打折促销的运营活动。

在折线图中,有一条代表平均值的横线,以及一条带箭头的趋势线,它们有助于对数据整体趋势的把握。

从上面的图中可以看出,中秋节放假之后,销量有所上升,结合广告费的投入数据进行分析,计算它们相关系数,发现销量与广告费之间具有比较强的正相关性,也就是说,中秋节之后,销量上升的主要原因,是公司加大了广告费的投入。

通过上面的分析解读,我们知道,折线图能直观地反映出数据随着时间变化的趋势,让数据更容易进行对比,发现数据背后规律性的知识,从而帮助管理者更好地做出决策。

画图不是为了炫技,而是为了提高信息传递的效率。你不妨反思一下自己画过的图,是不是提高了信息传递的效率呢?

画图方法

能画折线图的软件工具有很多,本文采用的是 Python中的 matplotlib库。

在Jupyter Lab 中运行以下 Python代码,就可以画出上面那张折线图。

读取数据

# 读取每日销售数据

df = pd.read_excel('2019年9月每日销售.xlsx')

df

日期 实际销量

0 2019-09-01 7

1 2019-09-02 16

2 2019-09-03 18

3 2019-09-04 16

4 2019-09-05 18

5 2019-09-06 16

6 2019-09-07 9

7 2019-09-08 7

8 2019-09-09 16

9 2019-09-10 15

10 2019-09-11 17

11 2019-09-12 16

12 2019-09-13 3

13 2019-09-14 6

14 2019-09-15 7

15 2019-09-16 25

16 2019-09-17 23

17 2019-09-18 22

18 2019-09-19 23

19 2019-09-20 21

20 2019-09-21 13

21 2019-09-22 12

22 2019-09-23 22

23 2019-09-24 23

24 2019-09-25 23

25 2019-09-26 22

26 2019-09-27 24

27 2019-09-28 13

28 2019-09-29 12

29 2019-09-30 29

开始分析和画图

# 定义画图的数据

x = df.日期

y = df.实际销量

# 定义颜色

color1 = '#0085c3'

color2 = '#7ab800'

color3 = '#dc5034'

# 设置图像大小

fig = plt.figure(figsize=(10, 8))

ax = fig.add_subplot(111)

# 绘制折线图

ax.plot(x, y, marker='o', color=color1)

fig

# 标注最大值

ax.text(x[y.idxmax()]+timedelta(hours=-12),

y.max()+1, y.max(),

color=color1, fontsize=15)

# 标注最小值

ax.text(x[y.idxmin()]+timedelta(hours=-9),

y.min()-2, y.min(),

color=color1, fontsize=15)

fig

# 计算 7 天移动平均

y2 = y.rolling(7).mean()

# 绘制趋势线

ax.plot(x, y2, ls='--', color=color2, label='7 天移动平均')

fig

# 绘制平均值线

ax.hlines(y.mean(), x[0], x[-1:],

linestyles='-.', colors=color3)

# 标注平均值

ax.text(x[-1:]+timedelta(days=-7.5), y.mean()-2,

'平均值: ' + str(round(y.mean(),1)),

color=color3, fontsize=15)

fig

# 绘制箭头

plt.annotate('', xy=(x[-1:], y2[-1:]),

xytext=(x[-2:-1], y2[-2:-1]),

arrowprops=dict(arrowstyle='->',

color=color2,

shrinkB=0))

# 标注特殊事件

ax.annotate('中秋节', xy=(x[y.idxmin()], y.min()), color=color1,

xytext=(x[y.idxmin()]+timedelta(days=1.5), y.min()-2),

arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

ax.annotate('打折促销', xy=(x[y.idxmax()], y.max()), color=color1,

xytext=(x[y.idxmax()]+timedelta(days=-5), y.max()+2),

arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

fig

# 设置网格线

ax.grid(ls=':', color='gray', alpha=0.6)

# 设置图例的位置和大小

ax.legend(loc='upper left', fontsize=12)

# 设置坐标轴标签的角度和大小

plt.xticks(rotation=90, fontsize=12)

plt.yticks(fontsize=12)

# 设置 y 轴的刻度范围

ax.set_ylim(0, y.max()+5)

# 设置图表标题

_ = ax.set_title('2019年9月每日销量变化趋势', fontsize=25)

fig

补充

Series.idxmax(self,axis = 0,skipna = True,* args,** kwargs )返回最大值的行标签

代码合集

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from datetime import timedelta

# 正常显示中文标签

plt.rcParams['font.sans-serif'] = ['SimHei']

# 正常显示负号

plt.rcParams['axes.unicode_minus'] = False

# 读取每日销售数据

df = pd.read_excel('./data/2019年9月每日销售.xlsx')

# 定义画图的数据

x = df.日期

y = df.实际销量

# 定义颜色

color1 = '#0085c3'

color2 = '#7ab800'

color3 = '#dc5034'

# 设置图像大小

fig = plt.figure(figsize=(10, 8))

ax = fig.add_subplot(111)

# 绘制折线图

ax.plot(x, y, marker='o', color=color1)

# 标注最大值

ax.text(x[y.idxmax()]+timedelta(hours=-12),

y.max()+1, y.max(),

color=color1, fontsize=15)

# 标注最小值

ax.text(x[y.idxmin()]+timedelta(hours=-9),

y.min()-2, y.min(),

color=color1, fontsize=15)

# 计算 7 天移动平均

y2 = y.rolling(7).mean()

# 绘制趋势线

ax.plot(x, y2, ls='--', color=color2, label='7 天移动平均')

# 绘制箭头

plt.annotate('', xy=(x[-1:], y2[-1:]),

xytext=(x[-2:-1], y2[-2:-1]),

arrowprops=dict(arrowstyle='->',

color=color2,

shrinkB=0))

# 绘制平均值线

ax.hlines(y.mean(), x[0], x[-1:],

linestyles='-.', colors=color3)

# 标注平均值

ax.text(x[-1:]+timedelta(days=-7.5), y.mean()-2,

'平均值: ' + str(round(y.mean(),1)),

color=color3, fontsize=15)

# 标注特殊事件

ax.annotate('中秋节', xy=(x[y.idxmin()], y.min()), color=color1,

xytext=(x[y.idxmin()]+timedelta(days=1.5), y.min()-2),

arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

ax.annotate('打折促销', xy=(x[y.idxmax()], y.max()), color=color1,

xytext=(x[y.idxmax()]+timedelta(days=-5), y.max()+2),

arrowprops=dict(arrowstyle='->', color=color1), fontsize=15)

# 设置网格线

ax.grid(ls=':', color='gray', alpha=0.6)

# 设置图例的位置和大小

ax.legend(loc='upper left', fontsize=12)

# 设置坐标轴标签的角度和大小

plt.xticks(rotation=90, fontsize=12)

plt.yticks(fontsize=12)

# 设置 y 轴的刻度范围

ax.set_ylim(0, y.max()+5)

# 设置图表标题

_ = ax.set_title('2019年9月每日销量变化趋势', fontsize=25)

python画折线图代码-Python折线图的分析过程和画图的方法相关推荐

  1. 用python画爱心的代码-Python一行代码画个爱心案例

    昨天六一儿童节,大小朋友都过节了,真好!"人生易老天难老",这很现实,读这句诗不期然就有一种沧桑的感觉.而要人生幸福,是需要保持一颗童心的.<三字经>开篇说" ...

  2. python画pr曲线代码_Yolov3测试图及绘制PR曲线,yoloV3,map,和,画

    训练指令:./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 | tee train_yolov3.lo ...

  3. python画圆简单代码-Python 用turtle实现用正方形画圆的例子

    最近发现一个很有意思的画图的python库,叫做turtle,这里先说下用turtle这个库来实现用正方形画圆的思路. 每次都用乌龟(turtle) 来画出一个正方形,然后通过旋转3°后,继续画一样的 ...

  4. python画圆简单代码-python实现画圆功能

    本文实例为大家分享了python实现画圆功能的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ __author__= 'Du' ...

  5. python画圆简单代码-Python画直线 画圆 画矩形代码

    时间:2018-11-27 概述:画图 Python画图的一些例子代码,学用rectangle画方形.利用for循环控制100-999个数,每个数分解出个位,十位,百位.程序源代码: from tki ...

  6. 如何用python画圆形的代码-Python实现的圆形绘制(画圆)示例

    本文实例讲述了Python实现的圆形绘制.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 import numpy as np import ma ...

  7. 如何用python画圆形的代码-python – 如何快速绘制数千个圆圈?

    这里的关键是使用Collection.在您的情况下,您想要制作PatchCollection. Matplotlib通过使用集合优化绘制许多类似的艺术家.它比单独绘制每一个要快得多.此外,该剧情不会包 ...

  8. 全国多地新冠病例0增长,教你用Python画出当下疫情最火玫瑰图!

    CDA数据分析师 出品 近日,新冠肺炎防控成果的好消息不断. 今天我们聊聊,惊艳的疫情直观图. 据国家卫健委数据统计, 截止至3月10日24时,31省区市累计治愈出院病历超6万,达到61475例. 3 ...

  9. python炫酷烟花表白源代码,用python画烟花的代码

    大家好,小编为大家解答python绘制烟花特定爆炸效果的问题.很多人还不知道python炫酷烟花表白源代码,现在让我们一起来看看吧! 1.放烟花的代码 放烟花的代码相关内容如下: 烟花其实可以看成由一 ...

最新文章

  1. matlab 中调用s函数表达式,[求助]S函数中能否调用M函数
  2. python subprocess Popen
  3. 导出Oracle数据库用户Procedure和Function为文本文件的小工具
  4. Docker小白到实战之Docker网络简单了解一下
  5. 关于在pjsip中添加视频的流程说明
  6. fatal: Could not read from remote repository.的解决办法
  7. NCRE四级网络工程师考题详解----LRU与LFU的区别
  8. 利用Pin分析程序的动态行为特征
  9. maven安装配置换阿里源
  10. MATLAB统计签选课名单程序,关于2018级方向课程选择的通知(1.7选课名单公布)...
  11. 塔菲克蓝牙适配器驱动_TAFIQ蓝牙适配器4.0驱动下载
  12. linux 卸载theano,centos 安装theano
  13. excel 常用快捷键及小技巧
  14. 电脑上查看自己连接的WIFI密码
  15. java格式化xml字符串_XML串的格式化输出
  16. 微信小程序来了,整理微信小程序学习教程网站
  17. 表格控件SpreadJS开发案例:应收账款帐龄分析表(附源码)
  18. Away3D4.0入门教程
  19. 真正通俗易懂的傅里叶变换讲解
  20. 二次曲面的绘制函数(一)

热门文章

  1. 开发日记-20190817 关键词 Hello Unix
  2. 开发日记-20190605 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  3. TLS与SSL之间关系——SSL已经被IEFT组织废弃,你可以简单认为TLS是SSL的加强版
  4. iodine免费上网——本质就是利用dns tunnel建立tcp,然后tcp proxy来实现通过访问虚拟dns0网卡来访问你的dns 授权server...
  5. DDos攻击,使用深度学习中 栈式自编码的算法
  6. python berkeley DB操作——打开btree索引文件中的database
  7. python berkeley 操作——尤其提示 需版本匹配
  8. 详解正则表达式匹配方法 match()
  9. 【css】报错,错误代码77,CURLE_SSL_CACERT_BADFILE (77)解决方法
  10. Golang内建库学习笔记(1)-sort和container