折线图(运营数据分析)--python

折线图

概念

折线图:用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势。在折线图中,数据是递增还是递减、增减的速率、增减的规律(周期性、螺旋性等)、峰值等特征都可以清晰地反映出来。所以,折线图常用来分析数据随时间的变化趋势,也可用来分析多组数据随时间变化的相互作用和相互影响

数据简介

数来自某程序客户端15日uv数据(处理后数据),同过折线图展示数据的时间变化趋势,和日环比数据。

数据样例
在这里插入图片描述

Python实现

  • 导入需要的包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
  • 计算日环比
# 计算环比数据
plot_data['huanbi'] = plot_data.uv.pct_change()*100
# 由于第一天没有环比数据,计算后为空值,使用0来填充空值
plot_data = plot_data.fillna(0)

在这里插入图片描述

  • matplotlib 绘图
  • 首先绘制基本图形
plt.figure(figsize=(30,12))
plt.plot(
    plot_data.日期,  # x轴
    plot_data.uv,   # y轴
    "-o",  # 标记点
    mfc='red',  # 标记点颜色
    alpha=0.7,  # 透明度 整体
    ms=6,  # 标记点 大小
    label = 'uv',
    lw = 3
    )

# x轴 字体大小
plt.xticks(size=15)
# Y轴数值范围大小
plt.ylim(top=max(plot_data.uv)*1.05,bottom=min(plot_data.uv)*0.9)

请添加图片描述

  • 添加网格、数据标签

# 添加数值
for i in range(len(plot_data)):
    plt.text(
        x=i,
        y=plot_data.iloc[:,1][i]+120,
        s=plot_data.iloc[:,1][i],
        fontsize = 15,
        color = 'black',
        alpha = 0.8,
        ha = 'center',   # 左右居中
        # va = 'center',  # 上下居中
        # rotation = 30,   # 旋转字体
        )
plt.legend(
    fontsize = 20,  # 控制  字体大小
    markerscale =1,  # 控制  点大小
    scatterpoints=1   # 控制 点的数量
    )
plt.grid(True)   # 开启网格

请添加图片描述

  • 添加环比数据,并用颜色区分增长,如绿色表示增加,红色表示降低
# 设定红和绿的颜色
red = (1,0.3,0.3)
green = (0.3,0.8,0.3)
# 添加 环比数据显示
# 通过if 语句来控制颜色
for i in range(len(plot_data)):
    if plot_data.iloc[:,2][i] >=0:
        plt.text(
            x=i,  # x轴的位置
            y=plot_data.iloc[:,1][i]+500,   # 展示的高度
            s='环比:+'+str(round((plot_data.iloc[:,2][i]),2))+'%',
            size = 15,
            alpha = 0.7,
            # rotation = 10,
            ha = 'center',
            # va = 'center',
            bbox = dict(
                boxstyle = 'round',
                ec = (1.,0.5,0.5),
                fc = green
                )
            )
    else:
        plt.text(
            x=i,
            y=plot_data.iloc[:,1][i]+500,
            s='环比:'+str(round((plot_data.iloc[:,2][i]),2))+'%',
            size = 15,
            alpha = 0.7,
            # rotation = 10,
            ha = 'center',
            # va = 'center',
            bbox = dict(
                boxstyle = 'round',
                ec = (1.,0.5,0.5),
                fc = red
                )
            )

请添加图片描述

  • 添加趋势线
# 添加趋势线

x = [x for x in range(len(plot_data))]
y = plot_data.uv
z = np.polyfit(x,y,1)
p = np.poly1d(z)
plt.plot(x,p(x),':',lw=3,color = (1,0.5,0.5))

plt.show()

请添加图片描述

  • 能够很直观的看出,绿色表示增长,红色表示下降,幅度是多少,还有每天的实际uv值
  • 通过趋势线还能看出近期的趋势是增长还是下降
完整绘图代码
plt.figure(figsize=(30,12))
plt.plot(
    plot_data.日期,  # x轴
    plot_data.uv,   # y轴
    "-o",  # 标记点
    mfc='red',  # 标记点颜色
    alpha=0.7,  # 透明度 整体
    ms=6,  # 标记点 大小
    label = 'uv',
    lw = 3
    )
# x轴 字体大小
plt.xticks(size=15)
# Y轴数值范围大小
plt.ylim(top=max(plot_data.uv)*1.05,bottom=min(plot_data.uv)*0.9)
# 添加标题
plt.title('近15日uv趋势',fontsize = 30)

# 添加数值
for i in range(len(plot_data)):
    plt.text(
        x=i,
        y=plot_data.iloc[:,1][i]+120,
        s=plot_data.iloc[:,1][i],
        fontsize = 15,
        color = 'black',
        alpha = 0.8,
        ha = 'center',   # 左右居中
        # va = 'center',  # 上下居中
        # rotation = 30,   # 旋转字体
        )
plt.legend(
    fontsize = 20,  # 控制  字体大小
    markerscale =1,  # 控制  点大小
    scatterpoints=1   # 控制 点的数量
    )
plt.grid(True)   # 开启网格
red = (1,0.3,0.3)
green = (0.3,0.8,0.3)
# 添加 环比
for i in range(len(plot_data)):
    if plot_data.iloc[:,2][i] >=0:
        plt.text(
            x=i,
            y=plot_data.iloc[:,1][i]+500,
            s='环比:+'+str(round((plot_data.iloc[:,2][i]),2))+'%',
            size = 15,
            alpha = 0.7,
            # rotation = 10,
            ha = 'center',
            # va = 'center',
            bbox = dict(
                boxstyle = 'round',
                ec = (1.,0.5,0.5),
                fc = green
                )
            )
    else:
        plt.text(
            x=i,
            y=plot_data.iloc[:,1][i]+500,
            s='环比:'+str(round((plot_data.iloc[:,2][i]),2))+'%',
            size = 15,
            alpha = 0.7,
            # rotation = 10,
            ha = 'center',
            # va = 'center',
            bbox = dict(
                boxstyle = 'round',
                ec = (1.,0.5,0.5),
                fc = red
                )
            )
# 添加趋势线
x = [x for x in range(len(plot_data))]
y = plot_data.uv
z = np.polyfit(x,y,1)
p = np.poly1d(z)
plt.plot(x,p(x),':',lw=3,color = (1,0.5,0.5))
plt.show()

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值