数据可视化——COVID-2019 data

考完试无聊,下载了新冠肺炎的一些数据做了数据可视化,当作练练手。
数据集下载链接
此次使用了covid_19_data.csv数据
注:因为这个数据隔段时间会更新因此不同时间下载的统计日期会不同。该篇文章的数据统计日期截止到2020/07/08。

相关知识点:pandas分组,折线图、堆叠图、饼图的绘制。

一、GDP前十国家的确诊人数变化图

思路

covid_19_data.csv:
在这里插入图片描述
读入数据是pandas类型数据,这是比较常见的类型。
要统计美国、中国、日本、德国、法国、英国、印度、意大利、巴西、加拿大十个国家的确诊人数的变化图,首先需要生成每个国家的确诊人数列表。
观察数据可知一个国家经常包含多个省份/州,而这些应该加在一起作为一个国家的数据,因此首先对国家进行分组:

df_Country = df.groupby(['Country'])

制作date列表

date = df['Date'].drop_duplicates().values.tolist() # drop_duplicates(),去掉重复行
date_list = [str(x) for x in date] #将list中的数字型转为str型

接下来制作单个国家的数据列表
以Mainland China为例,首先用get_group()获取Mainland China数据,在此基础上按Date分组并求和,获得每天的总数据。
在这里插入图片描述
最后单独提取出Confirmed数据,转为list。

grouped = df_Country.get_group('Mainland China')
china_data = grouped.groupby('Date').sum()
china_confirmed = china_data['Confirmed'].tolist()

Code

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker
path = "D:/Kaggle/Covid-2019/covid_19_data/covid_19_data.csv" #路径自行设定
df = pd.read_csv(path)

#重命名列名
df = df.rename(columns={'Country/Region':'Country'})
df = df.rename(columns={'ObservationDate':'Date'})

df_Country = df.groupby(['Country']) #按Country分组
date = df['Date'].drop_duplicates().values.tolist() # drop_duplicates(),去掉重复行
date_list = [str(x) for x in date] #将list中的数字型转为str型

#-----Mainland China
grouped = df_Country.get_group('Mainland China')
china_data = grouped.groupby('Date').sum()
china_confirmed = china_data['Confirmed'].tolist()

#-----US
grouped = df_Country.get_group('US')
us_data = grouped.groupby('Date').sum()
us_confirmed = us_data['Confirmed'].tolist()

#-----Brazil
grouped = df_Country.get_group('Brazil')
brazil_data = grouped.groupby('Date').sum()
brazil_confirmed = brazil_data['Confirmed'].tolist()

#-----UK
grouped = df_Country.get_group('UK')
uk_data = grouped.groupby('Date').sum()
uk_confirmed = uk_data['Confirmed'].tolist()

#-----India
grouped = df_Country.get_group('India')
india_data = grouped.groupby('Date').sum()
india_confirmed = india_data['Confirmed'].tolist()

#-----France
grouped = df_Country.get_group('France')
france_data = grouped.groupby('Date').sum()
france_confirmed = france_data['Confirmed'].tolist()

#-----Germany
grouped = df_Country.get_group('Germany')
germany_data = grouped.groupby('Date').sum()
germany_confirmed = germany_data['Confirmed'].tolist()

#-----Italy
grouped = df_Country.get_group('Italy')
italy_data = grouped.groupby('Date').sum()
italy_confirmed = italy_data['Confirmed'].tolist()

#-----Canada
grouped = df_Country.get_group('Canada')
canada_data = grouped.groupby('Date').sum()
canada_confirmed = canada_data['Confirmed'].tolist()

#-----Japan
grouped = df_Country.get_group('Japan')
japan_data = grouped.groupby('Date').sum()
japan_confirmed = japan_data['Confirmed'].tolist()

#因为每个国家确诊人数统计开始日期不同,所以以统计时间最早的为准,时间短的在列表前补len(date_list)-len(country)个0
countries_confirmed = [china_confirmed,us_recovered,brazil_confirmed,uk_confirmed,india_confirmed,france_confirmed,
           germany_confirmed,italy_confirmed,canada_confirmed,japan_confirmed]
for country in countries_confirmed:
    if len(country) < len(date_list):
        for i in range(len(date_list) - len(country)):
            country.insert(0, 0)

#画图
plt.plot(date_list,china_confirmed,color = 'red',label="China")
plt.plot(date_list,us_confirmed,color = 'blue',label="US")
plt.plot(date_list,brazil_confirmed,color = 'green',label="Brazil")
plt.plot(date_list,uk_confirmed,color = 'black',label="UK")
plt.plot(date_list,india_confirmed,color = 'pink',label="India")
plt.plot(date_list,france_confirmed,color = 'yellow',label="France")
plt.plot(date_list,germany_confirmed,color = 'orange',label="Germany")
plt.plot(date_list,italy_confirmed,color = '#00FFFF',label="Italy")
plt.plot(date_list,canada_confirmed,color = '#C0C0C0',label="Canada")
plt.plot(date_list,japan_confirmed,color = '#808000',label="Japan")
plt.title("Confirmed number")
plt.xlabel("Date")
plt.ylabel("Number")
plt.grid(axis='y') #水平线显示
ax = plt.gca() #获取坐标信息
ax.set_facecolor('#FFFAF0') #设置背景颜色
#调整x轴刻度密度,相隔tick_spacing个刻度显示一个,有效防止刻度太多显示重合
tick_spacing = 10
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.xticks(rotation=30) #旋转x轴坐标刻度,有效防止xlabel太长显示重合
plt.legend()
plt.tight_layout()
plt.show()

效果图

在这里插入图片描述
果然美国一骑绝尘,巴西印度紧跟上。

二、美国三个指标变化图

思路

思路较简单,在第一部分组思路上将生成deaths_list和recovered_list即可。此部分因注意堆叠图的画法。

Code

import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

path = "D:/Kaggle/Covid-2019/covid_19_data/covid_19_data.csv" #自行设定
df = pd.read_csv(path)

df = df.rename(columns={'Country/Region':'Country'})
df = df.rename(columns={'ObservationDate':'Date'})

df_Country = df.groupby(['Country']) #按Country分组

date = df['Date'].drop_duplicates().values.tolist() # drop_duplicates(),去掉重复行
date_list = [str(x) for x in date] #将list中的数字型转为str型,实用。
print(date_list)

grouped = df_Country.get_group('US')
us_data = grouped.groupby('Date').sum()
print(us_data)
us_confirmed = us_data['Confirmed'].tolist()
us_deaths = us_data['Deaths'].tolist()
us_recovered = us_data['Recovered'].tolist()
if len(us_confirmed)<len(date_list):
    for i in range(len(date_list)-len(us_confirmed)):
        us_confirmed.insert(0,0)
print(len(us_confirmed))

#画图(堆叠图)
info = ['deaths','recovered','confirmed'] #标签
color = ['#FF4040','#87CEFA','#FFF68F',] #颜色
plt.stackplot(date_list,us_deaths, us_recovered,us_confirmed,  labels=info, colors = color) #堆叠图
plt.legend(loc='upper left')
tick_spacing = 10
ax = plt.gca() #获取坐标信息
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.xticks(rotation=30) #旋转x轴坐标刻度,有效防止xlabel太长显示重合
plt.grid(axis='y') #水平线显示
plt.title("US data")
plt.xlabel("date")
plt.ylabel("number")
plt.tight_layout()
plt.show()

效果图

在这里插入图片描述
美国确诊人数上升加速度有增大趋势,所幸的是死亡率也在降低。

GDP前十国家确诊人数占全球数据的比例

思路

思路和第一部分类似,不同的是这次统计最后截止日期的确诊人数,以及需要计算出全球确诊人数,因此分类标准不同。
首先对Date分组

df_lastday = df.groupby(['Date']) 

然后对每一个Date组求和,提取07/08/2020的数据,可以得到07/08/2020的每个国家的数据。
在这里插入图片描述
求Confirmed列所有数据总和可以得到全球确诊人数,但由于sum()得到的数据是pandas类型,因此转为list型并取第一个数,得到全球确诊人数。

grouped = df_lastday.get_group('07/08/2020')
confirmed_number = grouped.groupby('Date').sum()
confirmed_number = confirmed_number['Confirmed'].tolist()
confirmed_number = confirmed_number[0]
print(confirmed_number)

之后生成每个国家的confirmed列表,与第一部分相同。此部分应注意饼状图的画法。

Code

import pandas as pd
from matplotlib import pyplot as plt

path = "D:/Kaggle/Covid-2019/covid_19_data/covid_19_data.csv"#自行设定
df = pd.read_csv(path)

df = df.rename(columns={'Country/Region':'Country'})
df = df.rename(columns={'ObservationDate':'Date'})

df_lastday = df.groupby(['Date']) #按Date分组

date = df['Date'].drop_duplicates().values.tolist() # drop_duplicates(),去掉重复行
date_list = [str(x) for x in date] #将list中的数字型转为str型

#计算截至2020.7.8确诊总人数
grouped = df_lastday.get_group('07/08/2020')
confirmed_number = grouped.groupby('Date').sum()
confirmed_number = confirmed_number['Confirmed'].tolist()
confirmed_number = confirmed_number[0]

df_Country = df.groupby(['Country']) #依次按Country分组

grouped = df_Country.get_group('US')
us_data = grouped.groupby('Date').sum()
us_confirmed = us_data['Confirmed'].tolist()[-1] #取列表最后一个数据:最后一天数据

grouped = df_Country.get_group('Mainland China')
china_data = grouped.groupby('Date').sum()
china_confirmed = china_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('Japan')
japan_data = grouped.groupby('Date').sum()
japan_confirmed = japan_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('Germany')
germany_data = grouped.groupby('Date').sum()
germany_confirmed = germany_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('UK')
uk_data = grouped.groupby('Date').sum()
uk_confirmed = uk_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('France')
france_data = grouped.groupby('Date').sum()
france_confirmed = france_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('Brazil')
brazil_data = grouped.groupby('Date').sum()
brazil_confirmed = brazil_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('India')
india_data = grouped.groupby('Date').sum()
india_confirmed = india_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('Italy')
italy_data = grouped.groupby('Date').sum()
italy_confirmed = italy_data['Confirmed'].tolist()[-1]

grouped = df_Country.get_group('Canada')
canada_data = grouped.groupby('Date').sum()
canada_confirmed = canada_data['Confirmed'].tolist()[-1]

#求全球剩余国家的确诊人数
other = confirmed_number-us_confirmed-china_confirmed-japan_confirmed-germany_confirmed-uk_confirmed-france_confirmed-brazil_confirmed-india_confirmed-italy_confirmed-canada_confirmed
#创建字典
info = {'US':us_confirmed,
        'Mainland China':china_confirmed,
        'Japan':japan_confirmed,
        'Germany':germany_confirmed,
        'UK':uk_confirmed,
        'France':france_confirmed,
        'Brazil':brazil_confirmed,
        'India':india_confirmed,
        'Italy':italy_confirmed,
        'Canada':canada_confirmed,
        'other':other}
#为了饼状图美观,对数据进行排序
info = sorted(info.items(),key=lambda x:x[1],reverse=True) #按照字典value排序,生成一列表,列表元素为元组,元组元素为国家(key),确诊人数(value)。
#单独对国家、对应的确诊人数生成列表,方便画图
sizes=[]
labels=[]
for i in range(len(info)):
    labels.append(info[i][0])
    sizes.append(info[i][1])
    
#画图
colors = ['#87CEFF','#FF7256','#FFE7BA','#B3EE3A','#E6E6FA','#FFC0CB','#CDC0B0','#C1CDCD','#FFFF00','#54FF9F','#F5F5F5'] #颜色
explode = (0,0,0,0,0,0,0,0,0,0,0) #突出显示设定
patches,l_text,p_text = plt.pie(sizes,
                              explode=explode,
                              labels=labels,
                              colors=colors,
                              autopct = '%3.1f%%', #数值保留固定小数位
                              shadow = False, #无阴影设置
                              startangle =90, #逆时针起始角度设置
                              pctdistance = 1.2) #数值距圆心半径倍数距离
#l_text :饼图外文本,p_text:饼图内文本
for t in l_text:
    t.set_size(0)
for t in p_text:
    t.set_size(8)
plt.legend(labels)
plt.title('proportion')
plt.show()

效果图

在这里插入图片描述
美国、印度、巴西占据近半壁江山,中国大陆相比控制的很好。

此次练手,学习了pandas的分组方法,增强了对数据的整理能力,熟悉了折线图、堆叠图和饼状图的绘制以及相关细节调整,要牢记在确保准确的同时还不能忘记可视化的美观。

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值