可视化常见绘图(二)折线图
一.折线图简介(Line Chart)
折线图用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势。
在折线图中可以清晰的看出数据递增还是递减、增减的速率、增减的规律和峰值特征。折线图常用来分析数据随时间的变化趋势,也可用来分析多组数据随时间变化的相互作用和相互影响。在折线图中横轴通常用来表示时间跨度且时间间隔相同,纵轴表示不同时间时刻的数据值。
二.折线图的组成
一个折线图的构成包括:
横轴:表示时间
纵轴:表示数值
点:表示数据的位置
线:表示数据之间的趋势关系
三.使用场景
适用的场景:
- 适用于自变量连续,因变量有序的场景。
不适用的场景:
- 当水平轴的数据类型为无序的分类或者垂直轴的数据类型为连续时间时,不适合使用折线图。
四.实现
在matplotlib中使用plot
方法实现折线图。plot
方法介绍如下:
plot(args,scalex = True,scaley = True,data = None,** kwargs)
参数1:x:可迭代数值类型(长度必须与Y相等),指定x轴数据,默认range(len(y))
参数2:y:可迭代数值类型,指定y轴数据
参数3:fmt : 字符串型(可选),指定格式字符串,格式为[marker][linestyle][color]
marker:指定标记点样式
linestyle:指定折线线性
color:指定线条颜色
参数4:scalex : bool型, (可选), 默认True,指定X视图是否适用于数据限制
参数5:scalex: bool型, (可选), 默认True,指定Y视图是否适用于数据限制。
参数6:data : 指定需要标记的数据(可选)
**参数7:**** kwargs:接受的关键字参数传递给Line2D
类实例。
返回值:绘制数据的Line2D类实例列表
注:
<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">*args传递的可变参数包含x, y, fmt</mark>
实现代码:
import matplotlib.pyplot as plt
import numpy as np
x_data = np.array(['2011', '2012', '2013', '2014', '2015', '2016', '2017'])
y_data = np.array([58000, 60200, 63000, 71000, 84000, 90500, 107000])
y_data2 = np.array([52000, 54200, 51500, 58300, 56800, 59500, 62700])
# 初始化画图图框
figure, ax = plt.subplots(1, 2)
# 画y_data
line1 = ax[0].plot(y_data, marker='o', lw=2, ls='--', markersize=6, markerfacecolor='r', label="line1")
ax[0].legend()
ax[0].set_xticks(range(len(y_data)))
ax[0].set_xticklabels(x_data)
ax[0].set_title("line1", fontsize=20, fontweight="bold")
ax[0].set_xlabel("year", fontsize=15)
ax[0].set_ylabel("amount", fontsize=15)
# 画y_data2
line2 = ax[1].plot(y_data2, marker='o', lw=2, ls='-', color='k', markersize=6, markerfacecolor='b', label="line2")
ax[1].legend()
ax[1].set_xticks(range(len(y_data)))
ax[1].set_xticklabels(x_data)
ax[1].set_title("line2", fontsize=20, fontweight="bold")
ax[1].set_xlabel("year", fontsize=15)
ax[1].set_ylabel("amount", fontsize=15)
plt.show()
实现效果如下:
如果希望更加美观可以做如下更改
ax[0].grid(True)
:画网格ax[1].grid(True)
:画网格plt.style.use('ggplot')
:使用ggplot样式
效果如下:
[图片上传失败...(image-64d258-1641534336779)]
可以使用text
标记每一个标记点的数值,完整程序如下:
# 画y_data
line1 = ax[0].plot(y_data, lw=2, color='k', label="line1", marker='o', markerfacecolor='g')
ax[0].legend()
ax[0].set_xticks(range(len(y_data)))
ax[0].set_xticklabels(x_data)
ax[0].set_title("line1", fontsize=20, fontweight="bold")
ax[0].set_xlabel("year", fontsize=15)
ax[0].set_ylabel("amount", fontsize=15)
ax[0].grid(True)
# 对数据进行标记
for x_, y_ in zip(range(len(y_data)), y_data):
ax[0].text(x_, y_, y_, ha='left', va='top', color='red')
# 画y_data2
line2 = ax[1].plot(y_data2, lw=2, color='k', label="line2", marker='o', markerfacecolor='g')
ax[1].legend()
ax[1].set_xticks(range(len(y_data)))
ax[1].set_xticklabels(x_data)
ax[1].set_title("line2", fontsize=20, fontweight="bold")
ax[1].set_xlabel("year", fontsize=15)
ax[1].set_ylabel("amount", fontsize=15)
ax[1].grid(True)
# 对数据进行标记
for x_, y_ in zip(range(len(y_data2)), y_data2):
ax[1].text(x_, y_, y_, ha='left', va='top', color="red")
plt.show()
效果如下: