【Covid-19 疫苗接种 + Pyecharts】都2202年了,还有人不知道 Python 时间序列分析吗?

引言

看看最终效果:

我们直接开始吧~~~

获取数据

百度网盘:Covid-19 疫苗接种 实战数据
提取码:9394

演示环境:Python 3、Jupyter notebook
涉及技术:pyecharts + pandas

操作步骤

导入数据预处理、数据整合分析、数据可视化的库

from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.globals import SymbolType
from pyecharts.globals import GeoType
from pyecharts.options import ComponentTitleOpts
from pyecharts.components import Table
from pyecharts.charts import Pie,Bar,Map,Geo,Scatter,Page,Timeline,Line,Grid
from pyecharts.commons.utils import JsCode

import pandas as pd
import json
import warnings
warnings.filterwarnings('ignore')  # 忽略警告提示

1、导入数据

data = pd.read_csv('country_vaccinations.csv')
data.head(10)

输出:
在这里插入图片描述

2、查看数据,确定时间范围

#查看数据规模
print('数据规模:',data.shape)

输出:
—————————————————————————————————
数据规模: (12514, 15)
—————————————————————————————————

import seaborn as sns
#检查空值
data.isnull().sum()

输出:
—————————————————————————————————
country 0
iso_code 0
date 0
total_vaccinations 5038
people_vaccinated 5703
people_fully_vaccinated 7613
daily_vaccinations_raw 6229
daily_vaccinations 217
total_vaccinations_per_hundred 5038
people_vaccinated_per_hundred 5703
people_fully_vaccinated_per_hundred 7613
daily_vaccinations_per_million 217
vaccines 0
source_name 0
source_website 0
dtype: int64
—————————————————————————————————

#查看待处理数据的数据类型
data.dtypes

输出:
—————————————————————————————————
country object
iso_code object
date object
total_vaccinations float64
people_vaccinated float64
people_fully_vaccinated float64
daily_vaccinations_raw float64
daily_vaccinations float64
total_vaccinations_per_hundred float64
people_vaccinated_per_hundred float64
people_fully_vaccinated_per_hundred float64
daily_vaccinations_per_million float64
vaccines object
source_name object
source_website object
dtype: object
—————————————————————————————————

print(set([d[:7] for d in data.date]))
print(set([d for d in data.date]))

输出:
在这里插入图片描述

3、数据预处理

#去除重复值
print('去重前的数据规模:',data.shape)
data = data.drop_duplicates()  #按行去重
data = data.T.drop_duplicates().T  #按列去重
print('去重后的数据规模:',data.shape)

输出:
—————————————————————————————————
去重前的数据规模: (12514, 15)
去重后的数据规模: (12514, 15)
—————————————————————————————————

#处理空值
data = data.fillna(0)
data.head(5)

输出:
在这里插入图片描述

df_c = pd.read_csv('世界各国和地区名称代码.txt',sep=',')
df_c.head(5)

输出:
在这里插入图片描述

#查找标注不标准和代码表中信息不存在的国家
ill = []
for i in data.iso_code.values:
    if len(i) != 3:
        ill.append(i)
    if i not in df_c.三字母代码.values:
        ill.append(i)
print(set(ill))
cty = []
for c in set(ill):
    cty.append(data[data.iso_code==c].country.drop_duplicates().values[0])
print(cty)
print('需要手动标注国家:',len(cty))

输出:
在这里插入图片描述

#手动标注国家
r = {
    
    'OWID_ENG':'英国','OWID_KOS':'科索沃','CUW':'荷兰','OWID_WLS':'威尔士',
     'OWID_NIR':'北爱尔兰','SSD':'南苏丹','OWID_CYN':'北塞浦路斯','OWID_SCT':'斯柯特兰'}

c_cn = []  #存储国家中文名称
for i in data.iso_code.values:
    if i in r.keys():
        c_cn.append(r[i])
    else:
        c_cn.append(str(df_c[df_c.三字母代码==i].中文简称.values)[2:-2])
c_cn_ = []          
for c in c_cn:
    if c in ['中国台湾','中国澳门','中国香港']:
        c_cn_.append('中国')
    else:
        c_cn_.append(c)
        
data['国家'] = c_cn_
data.sample(5)

输出:
在这里插入图片描述

#处理日期,将年月和日分别进行记录
dates = [d.strip().split('/')[0]+'年'+d.strip().split('/')[1]+'月' for d in data.date]
day = [int(d.strip().split('/')[2]) for d in data.date]
data_m = data.copy()
data_m.date = dates
data_m['day'] = day
data_m.sample(5)

输出:
在这里插入图片描述

4、进行数据可视化

(1) 全球疫苗接种情况热力图

#整合数据
data_pre = data_m.groupby(['date','国家'])['total_vaccinations','people_vaccinated','people_fully_vaccinated',\
                           'total_vaccinations_per_hundred','people_vaccinated_per_hundred','people_fully_vaccinated_per_hundred'].max()

data_pre.columns = ['总接种','未完全接种','完全接种','接种率','未完全接种率','完全接种率']
#筛选数据
dates = []
countrys = []
pairs = {
    
    }
n = 0
j = 0
for i in data_pre.index:
    j += 1
    d, c = i[0], i[1]
    if d not in dates:
        dates.append(d)
        n += 1
        pairs[dates[n-1]] = []
    if d in dates:
        num = int(data_pre.总接种.values[j-1])
        if num > 0:
            num_未完全 = int(data_pre.未完全接种.values[j-1])
            num_完全 = int(data_pre.完全接种.values[j-1])
            rate_未完全 = float(data_pre.未完全接种率.values[j-1])
            rate_完全 = float(data_pre.完全接种率.values[j-1])
            pairs[dates[n-1]].append([c, num, num_未完全, num_完全,rate_未完全,rate_完全])
#读取整理好的国家中英文名字对照表
with open('世界国家(英文名-中文名).json','r',encoding='utf-8')as fp:
    name_map = json.load(fp)

开始利用 Pyecharts 模块作图:

t1 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='800px', height='450px'))
t1.add_schema(is_auto_play=True)
for month, datas in pairs.items():
    map1 = Map()
    map1.add("总接种人数", data_pair=[d[:2] for d in datas], maptype="world",is_map_symbol_show=False,name_map=name_map)

    map1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))   # 不显示label
    map1.set_global_opts(title_opts=opts.TitleOpts(title="全球 Covid-19 疫苗接种情况分布图", pos_left='34%', pos_top='20'),
         legend_opts=opts.LegendOpts(is_show=False),
         visualmap_opts=opts.VisualMapOpts(max_=209406814, min_=1, is_piecewise=True,
         pieces=[{
    
    "max": 100, "min": 1, "label": "1-100"},        # 分段  添加图例注释和颜色
                 {
    
    "max": 1000, "min": 100, "label": "100-1000"},
                 {
    
    "max": 10000, "min": 1000, "label": "1000-10,000"},
                 {
    
    "max": 100000, "min": 10000, "label": "10,000-100,000"},
                 {
    
    "max": 10000000, "min": 100000, "label": "100,000-10,000,000"},
                 {
    
    "min": 10000000, "label": ">=10,000,000"}
                ])
         )
    
    t1.add(map1,month)

t1.render_notebook()

输出:
在这里插入图片描述
ps:这里实际输出的可视化结果是可交互的动态的展示效果。

(2)全球国家Covid-19疫苗接种情况 Top 20

t2 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='700px', height='450px'))
t2.add_schema(is_auto_play=True, is_timeline_show=True)
for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list = [d[1] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y':y_list})
    temp = temp.sort_values(by='y').tail(20)
    bar2 = Bar()
    bar2.add_xaxis(list(temp.x.values)) #x轴数据
    bar2.add_yaxis('', [int(i) for i in temp.y.values])
    bar2.set_global_opts(title_opts=opts.TitleOpts(title="全球国家 Covid-19 疫苗接种总人数 Top 20", pos_left='9%', pos_top='20'), 
                        xaxis_opts=opts.AxisOpts(is_show=False)
                        ) 
    bar2.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
                                                   position = "right", font_size=12,
                                                   formatter="{c}人", font_style="italic"),
                         itemstyle_opts=opts.ItemStyleOpts(
                            color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0, 
                                         [{
                                             offset: 0,
                                             color: '#FF2400'
                                         }, {
                                             offset: 1,
                                             color: '#FF9200'
                                         }])"""))
                            )
    bar2.reversal_axis() 
    t2.add(bar2,month)

t2.render_notebook()

输出:
在这里插入图片描述

t3 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='400px', height='400px'))
t3.add_schema(is_auto_play=True, is_timeline_show=True)
color_series = ['#FF2400','#FF4900','#FF6D00','#FF9200','#FFB600']

for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list = [d[1] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y':y_list})
    temp = temp.sort_values(by='y').tail(5)
    a = temp.x.values.tolist()[::-1]
    b = [round(i/10000,2) for i in temp.y.values][::-1]

    pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC))

    pie.set_colors(color_series)
    # 添加数据,设置饼图的半径,是否展示成南丁格尔图
    pie.add("", [list(z) for z in zip(a, b)],
            radius=["10%", "100%"],
            center=["35%", "60%"],
            rosetype="area"
            )
    # 设置全局配置项
    pie.set_global_opts(title_opts=opts.TitleOpts(title='全球 Covid-19 疫苗国家接种 Top 5',pos_left='10%'),
                         legend_opts=opts.LegendOpts(is_show=False))
    # 设置系列配置项
    pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", font_size=14,
                                                   formatter="{b}\n{c}万人", font_style="italic",
                                                   font_weight="bold", font_family="Microsoft YaHei"))
    
    t3.add(pie,month)
    
t3.render_notebook()

输出:
在这里插入图片描述

(3)全球国家Covid-19疫苗接种率 Top 20

t4 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='800px', height='450px'))
t4.add_schema(is_auto_play=True, is_timeline_show=True)

for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list1 = [d[2] for d in datas]
    y_list2 = [d[3] for d in datas]
    y_list3 = [d[4] for d in datas]
    y_list4 = [d[5] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y1':y_list1, 'y2':y_list2, 'y3':y_list3, 'y4':y_list4})
    temp = temp.sort_values(by='y1', ascending=False).head(20)
    
    bar = Bar()
    bar.add_xaxis(list(temp.x.values)) #x轴数据
    bar.add_yaxis('完全接种(万人)', [int(i/10000) for i in temp.y2.values],
                   markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="average")]))
    bar.add_yaxis('未完全接种(万人)', [int(i/10000) for i in temp.y1.values],color='#E7AF62',
                   markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max"),opts.MarkPointItem(type_="min")]))
    bar.set_global_opts(title_opts=opts.TitleOpts(title="全球国家Covid-19 疫苗接种率 Top 20"),
                         legend_opts=opts.LegendOpts(pos_top="5%"),
                         tooltip_opts=opts.TooltipOpts(is_show=True,trigger_on='mousemove|click',axis_pointer_type='cross'),
                         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=35, interval=0)),#设置X轴坐标倾斜、旋转角度
                         yaxis_opts=opts.AxisOpts(type_="value",axislabel_opts=opts.LabelOpts(formatter="{value}万人")))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False))

    
    line = Line().add_xaxis(list(temp.x.values))
    line.add_yaxis("未完全接种率(%)", [float(i) for i in temp.y3.values], yaxis_index=1,symbol="triangle",symbol_size=5,
                                   areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
    line.add_yaxis("完全接种率(%)", [float(i) for i in temp.y4.values],yaxis_index=1,symbol_size=5,
                   linestyle_opts=opts.LineStyleOpts( type_="dashed"),areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
    line.set_series_opts(label_opts=opts.LabelOpts(is_show=False,
                                                       position = "right",
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#C23531'
                                             }, {
                                                 offset: 1,
                                                 color: '#E7AF62'
                                             }])""")))
    line.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=35, interval=0)),
                         yaxis_opts=opts.AxisOpts(type_="value",axislabel_opts=opts.LabelOpts(formatter="{value}%")),
                         legend_opts=opts.LegendOpts(pos_top="58%"))
    
    grid = (
        Grid()
        .add(bar, grid_opts=opts.GridOpts(pos_bottom="50%"))
        .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
    )
    t4.add(grid,month)

t4.render_notebook()

输出:
在这里插入图片描述
数据分析:从上面的组合图表发现,很多人口比较少的国家接种疫苗的比例比较高,完全接种人数上升也比较快,比如:以色列,其变化趋势最为突出。 结合全球主要国家Covid-19疫苗接种情况统计图发现,虽然中国的接种人数很多,但是接种率却不高,甚至接种率没有进入 TOP 20 国家。 然而,美国不仅接种的人数多,而且接种率也一直是最高的。

(4)每天的接种情况分析

针对前面的分析,对 中国、美国、以色列 的数据进行可视化。
1)筛选数据
由于原始数据中的很多列数据空缺严重,只有 接种人数/日、接种人数/百万人、研制机构、疫苗来源 4 列数据比较完整,因此取出这 4 列数据进行国家数据的分析。

#整合数据
data_day = pd.DataFrame()

data_day['国家'] = data_m.国家
data_day['年月'] = data_m.date
data_day['号数'] = data_m.day
data_day['接种人数/日'] = data_m.daily_vaccinations
data_day['接种人数/百万人'] = data_m.daily_vaccinations_per_million
data_day['研制机构'] = data_m.vaccines
data_day['疫苗来源'] = data_m.source_name

data_day.head(5)

输出:
在这里插入图片描述
删除数值有 0 的行,为了保证数据的真实性,不进行填充:

data_day = data_day.drop(index=(data_day.loc[(data_day['接种人数/日']==0)].index))
data_day = data_day.drop(index=(data_day.loc[(data_day['接种人数/百万人']==0)].index))

全球 Covid-19 疫苗研制机构情况可视化过程:

vaccine = []
count = []
for i in range(len(data_day.研制机构.values)):
    vs = data_day.研制机构.values[i].split(',')
    for j in vs:
        vaccine.append(j.strip())
        count.append(data_day['接种人数/日'].values[i]/len(vs))
vaccines = pd.DataFrame({
    
    '机构':vaccine, 'Count':count})
counts = vaccines.groupby('机构').sum().astype('int')
labels = {
    
    'Sinopharm/Beijing':'国药控股(北京)','Sinopharm/Wuhan':'国药控股(武汉)',  'Sinovac':'科兴生物(北京)', 
          'CanSino':'康希诺(中国天津)', 'Oxford/AstraZeneca':'阿斯利康(英国牛津)', 'Pfizer/BioNTech':'辉瑞(美国)',
          'Johnson&Johnson':'强生公司(美国)','Moderna':'莫德纳(美国)', 'EpiVacCorona':'矢量所(俄罗斯)', 
          'Sputnik V':'加玛列亚(俄罗斯)', 'Covaxin':'巴拉特(印度)'}
inst, count = [], []
for i in range(len(counts.values)):
    inst.append(labels[counts.index[i]])
    count.append(counts.values[i][0])

insts = pd.DataFrame({
    
    '机构':inst, '数量':count}).sort_values(by='数量', ascending = False)
insts

输出:
在这里插入图片描述

color_series = ['#9ECB3C','#6DBC49','#3DBA78','#14ADCF','#A63F98',
                '#C31C88','#D5225B','#D02C2A','#D44C2D','#D99D21','#C70000'][::-1]
pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='800px', height='500px'))
pie.set_colors(color_series)
pie.add("",[list(z) for z in zip(insts.机构, insts.数量)],radius=["35%", "77%"],rosetype='area')

pie.set_global_opts(title_opts=opts.TitleOpts(title="全球 Covid-19  \n\n  疫苗研发机构", pos_left='42%', pos_top='225'))
pie.set_series_opts(label_opts=opts.LabelOpts(position = "right",font_style='italic',formatter="{b}{d}%"))
pie.render_notebook()

输出:
在这里插入图片描述
2)中国的接种情况

data_cn = data_day[data_day.国家 == '中国'].reset_index()
data_cn.head(5)

输出:
在这里插入图片描述
检索中国 2020 年 12 月 的数据:

print(data_cn[data_cn.年月 == '2020年12月']['接种人数/日'].value_counts())
print(data_cn[data_cn.年月 == '2020年12月']['接种人数/百万人'].value_counts())

输出:
—————————————————————————————————
187500.0 16
Name: 接种人数/日, dtype: int64
130.0 16
Name: 接种人数/百万人, dtype: int64
—————————————————————————————————
数据分析:通过观察和上面的检索发现,中国 2020 年 12 月 的数据没有波动性,所以,不对这个月的数据进行可视化。

data_cn = data_cn.drop(index=(data_cn.loc[(data_cn['年月']=='2020年12月')].index))
#数据分组
data_pre = data_cn.groupby(['年月','号数'])['接种人数/日', '接种人数/百万人'].max()
data_pre.head(5)

输出:
在这里插入图片描述

#筛选数据
dates = []
pairs = {
    
    }
n = 0
j = 0
for i in data_pre.index:
    j += 1
    d, c = i[0], i[1]
    if d not in dates:
        dates.append(d)
        n += 1
        pairs[dates[n-1]] = []
    if d in dates:
        num_日接种 = int(data_pre['接种人数/日'].values[j-1])
        num_每百万接种 = int(data_pre['接种人数/百万人'].values[j-1])
        pairs[dates[n-1]].append([c, num_日接种, num_每百万接种])
t5 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='650px', height='310px'))
t5.add_schema(is_auto_play=True, is_timeline_show=True)

for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list1 = [d[1] for d in datas]
    y_list2 = [d[2] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y1':y_list1, 'y2':y_list2})
    temp = temp.sort_values(by='x')
    
    bar = Bar()
    bar.add_xaxis([str(d)+'日' for d in temp.x.values]) #x轴数据
    bar.add_yaxis('每日接种人数(万人)', [int(i/10000) for i in temp.y1.values],color='#E7AF62',
                   markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max"),opts.MarkPointItem(type_="min")]))
    bar.set_global_opts(title_opts=opts.TitleOpts(title="Covid-19 疫苗接种情况——中国"),
                         legend_opts=opts.LegendOpts(pos_left='47%',pos_top="1%"),
                         tooltip_opts=opts.TooltipOpts(is_show=True,trigger_on='mousemove|click',axis_pointer_type='cross'),
                         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),#设置X轴坐标倾斜、旋转角度
                         yaxis_opts=opts.AxisOpts(is_show=False))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False,position = "right",font_style='italic'),
                        itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#D94E5D'
                                             }, {
                                                 offset: 1,
                                                 color: '#EE5566'
                                             }])""")))

    
    line = Line().add_xaxis([str(d)+'日' for d in temp.x.values])
    line.add_yaxis("接种人数/百万人", [int(i) for i in temp.y2.values],yaxis_index=1,symbol_size=5,
                    areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
    line.set_series_opts(label_opts=opts.LabelOpts(is_show=False,
                                                       position = "right",
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#D94E5D'
                                             }, {
                                                 offset: 1,
                                                 color: '#EE5566'
                                             }])""")))
    line.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),
                         yaxis_opts=opts.AxisOpts(is_show=False),
                         legend_opts=opts.LegendOpts(pos_left='71%',pos_top="1%"),)
    
    grid = (
        Grid()
        .add(bar, grid_opts=opts.GridOpts(pos_bottom="50%"))
        .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
    )
    t5.add(grid,month)
    
t5.render_notebook()

输出:
在这里插入图片描述
3)美国的接种情况

data_us = data_day[data_day.国家 == '美国'].reset_index()
data_us.head(5)

输出:
在这里插入图片描述

#数据分组
data_pre = data_us.groupby(['年月','号数'])['接种人数/日', '接种人数/百万人'].max()
#筛选数据
dates = []
pairs = {
    
    }
n = 0
j = 0
for i in data_pre.index:
    j += 1
    d, c = i[0], i[1]
    if d not in dates:
        dates.append(d)
        n += 1
        pairs[dates[n-1]] = []
    if d in dates:
        num_日接种 = int(data_pre['接种人数/日'].values[j-1])
        num_每百万接种 = int(data_pre['接种人数/百万人'].values[j-1])
        pairs[dates[n-1]].append([c, num_日接种, num_每百万接种])
t6 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='650px', height='310px'))
t6.add_schema(is_auto_play=True, is_timeline_show=True)

for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list1 = [d[1] for d in datas]
    y_list2 = [d[2] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y1':y_list1, 'y2':y_list2})
    temp = temp.sort_values(by='x')
    
    bar = Bar()
    bar.add_xaxis([str(d)+'日' for d in temp.x.values]) #x轴数据
    bar.add_yaxis('每日接种人数(万人)', [int(i/10000) for i in temp.y1.values],color='#E7AF62',
                   markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max"),opts.MarkPointItem(type_="min")]))
    bar.set_global_opts(title_opts=opts.TitleOpts(title="Covid-19 疫苗接种情况——美国"),
                        legend_opts=opts.LegendOpts(pos_left='47%',pos_top="1%"),
                        tooltip_opts=opts.TooltipOpts(is_show=True,trigger_on='mousemove|click',axis_pointer_type='cross'),
                        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),
                        yaxis_opts=opts.AxisOpts(is_show=False))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False,position = "right",font_style='italic'),
                       itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#E28B60'
                                             }, {
                                                 offset: 1,
                                                 color: '#F89869'
                                             }])""")))

    
    line = Line().add_xaxis([str(d)+'日' for d in temp.x.values])
    line.add_yaxis("接种人数/百万人", [int(i) for i in temp.y2.values],yaxis_index=1,symbol_size=5,
                    areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
    line.set_series_opts(label_opts=opts.LabelOpts(is_show=False,
                                                       position = "right",
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#E28B60'
                                             }, {
                                                 offset: 1,
                                                 color: '#F89869'
                                             }])""")))
    line.set_global_opts(yaxis_opts=opts.AxisOpts(is_show=False),
                         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),
                         legend_opts=opts.LegendOpts(pos_left='71%',pos_top="1%"))
    
    grid = (
        Grid()
        .add(bar, grid_opts=opts.GridOpts(pos_bottom="50%"))
        .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
    )
    t6.add(grid,month)
    
t6.render_notebook()

输出:
在这里插入图片描述
4)以色列的接种情况

data_isr = data_day[data_day.国家 == '以色列'].reset_index()
data_isr.head(5)

输出:
在这里插入图片描述

#数据分组
data_pre = data_cn.groupby(['年月','号数'])['接种人数/日', '接种人数/百万人'].max()
#筛选数据
dates = []
pairs = {
    
    }
n = 0
j = 0
for i in data_pre.index:
    j += 1
    d, c = i[0], i[1]
    if d not in dates:
        dates.append(d)
        n += 1
        pairs[dates[n-1]] = []
    if d in dates:
        num_日接种 = int(data_pre['接种人数/日'].values[j-1])
        num_每百万接种 = int(data_pre['接种人数/百万人'].values[j-1])
        pairs[dates[n-1]].append([c, num_日接种, num_每百万接种])
t7 = Timeline(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC, width='650px', height='310px'))
t7.add_schema(is_auto_play=True, is_timeline_show=True)

for month, datas in pairs.items():
    x_list = [d[0] for d in datas]
    y_list1 = [d[1] for d in datas]
    y_list2 = [d[2] for d in datas]
    temp = pd.DataFrame({
    
    'x':x_list, 'y1':y_list1, 'y2':y_list2})
    temp = temp.sort_values(by='x')
    
    bar = Bar()
    bar.add_xaxis([str(d)+'日' for d in temp.x.values]) #x轴数据
    bar.add_yaxis('每日接种人数(万人)', [int(i/10000) for i in temp.y1.values],color='#E7AF62',
                   markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max"),opts.MarkPointItem(type_="min")]))
    bar.set_global_opts(title_opts=opts.TitleOpts(title="Covid-19 疫苗接种情况——以色列"),
                         legend_opts=opts.LegendOpts(pos_left='47%',pos_top="1%"),
                         tooltip_opts=opts.TooltipOpts(is_show=True,trigger_on='mousemove|click',axis_pointer_type='cross'),
                         xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),#设置X轴坐标倾斜、旋转角度
                         yaxis_opts=opts.AxisOpts(is_show=False))
    bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False,position = "right",font_style='italic'),
                       itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#EAC763'
                                             }, {
                                                 offset: 1,
                                                 color: '#FFDA6C'
                                             }])""")))

    
    line = Line().add_xaxis([str(d)+'日' for d in temp.x.values])
    line.add_yaxis("接种人数/百万人", [int(i) for i in temp.y2.values],yaxis_index=1,symbol_size=5,
                    areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
    line.set_series_opts(label_opts=opts.LabelOpts(is_show=False,
                                                       position = "right",
                                                       font_style='italic'),
                            itemstyle_opts=opts.ItemStyleOpts(
                                color=JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, 
                                             [{
                                                 offset: 0,
                                                 color: '#EAC763'
                                             }, {
                                                 offset: 1,
                                                 color: '#FFDA6C'
                                             }])""")))
    line.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45, interval=0)),
                         yaxis_opts=opts.AxisOpts(is_show=False),
                         legend_opts=opts.LegendOpts(pos_left='71%',pos_top="1%"),)
    
    grid = (
        Grid()
        .add(bar, grid_opts=opts.GridOpts(pos_bottom="50%"))
        .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
    )
    t7.add(grid,month)
    
t7.render_notebook()

输出:
在这里插入图片描述

5. 整合图表,生成HTML

#生成可拖拽图表的网页
page = Page(layout=Page.DraggablePageLayout)
page.add(
    t2,
    t1,
    #t3,
    t4,
    t5,
    t6,
    t7,
    pie
)
page.render('index.html')
from bs4 import BeautifulSoup

with open("index.html", "r+", encoding='utf-8') as html:
    html_bf = BeautifulSoup(html, 'lxml')
    body = html_bf.find("body")
    body["style"] = "background-color:#F0E8CD;"
    div_title="<div align=\"center\" style=\"width:1500px;\">\n<span style=\"font-size:32px;font face=\'黑体\';\
                color:#330022\"><b>全球 Covid-19 疫苗接种数据分析可视化</b></div>"  
    #修改页面背景色、追加标题
    body.insert(0,BeautifulSoup(div_title,"lxml").div)
    html_new = str(html_bf)
    html.seek(0, 0)
    html.truncate()
    html.write(html_new)
    html.close()
#整合所有图表 固定
Page.save_resize_html('1.html', cfg_file='chart_config.json')

输出的 HTML 文件,展示效果见篇头。

【就到这里吧,记得点个赞哦~】
【同时,欢迎留言、讨论~~~】

猜你喜欢

转载自blog.csdn.net/weixin_47068543/article/details/126397177