可视化小作业:制作动态折线图
选取的新冠肺炎疫情数据库地址:COVID-19-Data: 新冠病毒感染人数统计数据
由于湖北省的感染人数远远高于其他省份,故此处选取了广东省作为其他省份的代表来做动态可视化,否则整个画面的底部的曲线会颜色过于复杂,而且提前利用静态折线图(如图)可以看出,除湖北省外,其他省市区的感染人数较少,感染人数增长趋势是相似的。为了画面的简洁,动态图的制作只采用湖北省和广东省(除湖北省外感染人数最多的省份)的数据。
源代码如下,数据是用csv形式读取的,数据格式如图:
字段意思:time表示时间,price表示当日累计新增人数,quantity表示统计的第几天。
#多个动态折线图
# -*- coding: utf-8 -*-
# """
#
# """
#
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
matplotlib.rc("font", family='Microsoft YaHei')#family是设置的字体
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
if __name__ == '__main__':
OneFile = "data1.csv"
# 广东省数据
otherFile = "data2.csv"
# 湖北省数据
# print(1234567);
OneFileData = pd.read_csv(OneFile)
otherFileData = pd.read_csv(otherFile)
OneFileData.info() # 输出读入的csv数据的基本信息
otherFileData.info()
# Fixing random state for reproducibility
np.random.seed(196)
data = OneFileData.price #读入广东省感染人数
data1 = otherFileData.price #读入湖北省感染人数
xdata = np.arange(0, len(data))
print('xdata(x轴数据)',xdata)
print('data(y轴广东省数据)',data)
print('data(y轴湖北省数据)',data1)
# 初始数据绘图
dis = np.zeros(165)
diss = np.zeros(165)
dis2 = dis
diss2 = diss
fig, ax = plt.subplots()
line, = ax.plot(dis)
lines, = ax.plot(diss)
ax.set_ylim(0, 2000)
ax.legend(handles=[line,lines],labels=["广东省感染人数","湖北省感染人数"],loc="lower right",fontsize=6)
plt.grid(True)
ax.set_ylabel("感染人数/人")
ax.set_xlabel("统计时间/第X天")
ax.set_title("2020年1月20日至2020年7月02日 湖北省和广东省感染新冠肺炎人数趋势图")
def update(frame):
global dis
global dis2
global line
# 读入模拟
a = frame
time.sleep(np.random.rand() / 10)
# 绘图数据生成
dis[0:-1] = dis2[1:]
dis[-1] = a
dis2 = dis
# 绘图
line.set_ydata(dis)
# 颜色设置
plt.setp(line, 'linewidth', 2.0)
return line
def update1(frame1):
global diss
global diss2
global lines
# 读入模拟
b = frame1
time.sleep(np.random.rand() / 10)
# 绘图数据生成
diss[0:-1] = diss2[1:]
diss[-1] = b
diss2 = diss
# 绘图
lines.set_ydata(diss)
# 颜色设置
plt.setp(line, 'linewidth', 2.0)
return lines
ani = animation.FuncAnimation(fig, update, frames=data, interval=120)
ani1 = animation.FuncAnimation(fig, update1, frames=data1, interval=120)
plt.show()
最终效果图