matplotlib实现疫情数据可视化
程序员文章站
2022-06-01 12:50:41
...
matplotlib 绘制中美疫情对比折线图动画
%matplotlib notebook
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 1. 准备数据
# 1.1 加载数据
datas = pd.read_csv('./Desktop/currentConfirmedCount.csv')
# 1.2 准备折线图需要的数据
# 日期, 作为横轴的刻度
x_ticks = datas.dateId.values
# x轴的数据
x = list(range(x_ticks.shape[0]))
# 中国现有确诊病例数量
china = datas['中国'].values
# 美国现有确诊病例数量
usa = datas['美国'].values
# print(x_ticks)
# print(x)
# print(china)
# print(usa)
# 2. 创建画布
fig = plt.figure(figsize=(10, 6), dpi=100)
# 3. 初始化折线图和坐标轴的范围与刻度
# 3.1 定义变量, 用于记录每一帧折线图显示的数据条数
line_range = 8
# 3.2 定义变量, 用于记录每一帧x轴刻度的数量
xticks_range = 10
# 3.3 初始化中美折线图对象
china_line, = plt.plot([], [], color='r', marker='o', label='中国')
usa_line, = plt.plot([], [], color='g', marker='*', label='美国')
# 3.4 显示图例
plt.legend()
# 3.5 设置x轴,y轴的范围以及x轴的刻度
plt.ylim(0, max(usa))
plt.xlim(0, line_range)
plt.xticks(x[0: xticks_range], x_ticks[0: xticks_range])
plt.xlabel('日期') #为xy轴添加刻度标签
plt.ylabel('现存确诊人数')
plt.grid(linestyle='--',alpha = 0.7)
# 4. 实现动画的更新方法
def update(i):
# 更新折线图数据
start = 0 if i - line_range + 1 < 0 else i - line_range + 1
end = i + 1
# 更新中国折线图数据
china_line.set_data(x[start: end], china[start: end])
# 更新美国折线图数据
usa_line.set_data(x[start: end], usa[start: end])
# 设置x轴的范围和刻度
if i >= line_range:
xticks_end = end + (xticks_range-line_range) if end + (xticks_range-line_range) < len(x) else len(x)
# 更新x轴范围
plt.xlim(start, xticks_end)
# 更新x轴刻度
plt.xticks(x[start: xticks_end], x_ticks[start: xticks_end])
return china_line, usa_line
# 5. 创建动画对象
animation = FuncAnimation(fig, update, frames=x, repeat=False)
# 将动画保存为GIF格式的图片
animation.save('test_animation.gif',writer='imagemagick')
# 6. 展示
plt.show()
matplotlib 绘制top10国疫情对比条形图动画
%matplotlib notebook
#必须加上这句话,才有动画效果
import pandas as pd #加载数据,处理数据
import numpy as np #用于指定数据类型
import matplotlib.pyplot as plt #画图
from matplotlib.animation import FuncAnimation #动画类
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['font.serif'] = ['KaiTi']
# 1. 准备数据
# 1.1 加载数据
#index_col=0,指定dateid这一列为行索引,dtype=np.int32,将表中的数据全部变成整数
datas = pd.read_csv('./Desktop/currentConfirmedCount.csv', index_col=0, dtype=np.int32)
# 1.2 获取现存确诊病例数量前10的国家疫情信息,datas.iloc[行:, :列]
top10 = datas.iloc[4:, :10]
# 2. 创建画布和绘图区
#相同国家显示相同颜色
#1.准备国家与颜色字典
color=['r', 'g', 'b', 'm', 'c', 'yellow', 'orange', 'yellowgreen', 'hotpink', 'gold']
name_color_map = dict(zip(top10.columns,color))#zip方法使得top10的国家于上面的颜色列表一一对应,dict再将其转换为字典
fig, ax = plt.subplots(figsize=(10, 6), dpi=100) #figsize=(10, 6)画布大小, dpi=100清晰度
def update(date): #传入的是每一天的数据
#1. 绘制基本的条形图
# 清空画布
ax.clear()
# 准备数据 ,对条形图按现有确诊人数降序排序,sort_values()默认是升序,因为数据是从下往上开始添加的
data = top10.loc[date].sort_values()
#生成各个国家的颜色列表
color = [name_color_map[name] for name in data.index]
# 绘制条形图
ax.barh(data.index, data.values,height=0.6, color=color)
# 2. 添加辅助信息
# 2.1 在每一个柱状体上添加国家和现有确诊病例数量
for i, name in enumerate(data.index): #i,enumerate函数是为了添加索引
# 获取这个国家现有确诊病例数量
value = data[name]
# 现有确诊病例数量
dx = data.max() / 100#数字与条形图之间的小间距
ax.text(value+dx, i, value, fontsize=12,verticalalignment='center')
#宽度(这里直接用的样本数值),第几个条形图,数值,字体大小,让显示的内容上下居中
# 在条前添加国家名称并定位
name_x = value-len(name)*dx*2.5 #国家名显示的位置
if name_x > 0: #如果不能显示到条条中,就不显示了
ax.text(name_x, i, name, fontsize=12,verticalalignment='center')#同上
# 2.2 添加日期并确定位置
ax.text(0.8, 0.3, date, transform=ax.transAxes, fontsize=16)
# 2.3 设置x的刻度在顶部
ax.xaxis.set_ticks_position('top')
# 2.4 添加标题
ax.text(0, 1.06, '现有确诊病例数量', transform=ax.transAxes, fontsize=14)
ax.text(0.4, 1.12, 'Top10国疫情对比', transform=ax.transAxes, fontsize=18)
# 2.5 显示网格(x轴)
ax.grid(axis='x')
# 2.6 不显示画布四周边框
plt.box(False)
# 4. 创建动画并展示
animation = FuncAnimation(fig, update, frames=top10.index, repeat=False)#画布,更新方法,数据,是否重复
animation.save('test2_animation.gif',writer='imagemagick')
plt.show()
上一篇: 数据库常用操作SQL
下一篇: 宋闵公:过度戏谑,最终死于醉酒之臣的拳下
推荐阅读
-
通过python的matplotlib包将Tensorflow数据进行可视化的方法
-
Python数据可视化教程之Matplotlib实现各种图表实例
-
利用Python绘制MySQL数据图实现数据可视化
-
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
-
Python&matplotlib打造数据可视化动态图,完美装逼!
-
以911新闻为例演示Python实现数据可视化的教程
-
Python Matplotlib实现三维数据的散点图绘制
-
使用matplotlib库实现图形局部数据放大显示的实践
-
使用matplotlib库实现图形局部数据放大显示的实践
-
matplotlib交互式数据光标实现(mplcursors)