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