欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()