这里是对爬取的数据进行数据可视化分析,主要也是对pyecharts库的一个练习。
1.加载数据和引用库
import time
import json
import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Bar,Map,Line
//加载数据,
data = pd.read_csv("./today_province_2021_04_09.csv")
//查看该数据的头五行部分,初步了解
data.head()
观察数据可知,数据存在大量的空值,不便于后继可视化分析
故用 0 来填充数据中的空值
# 填充空值
data = data.fillna(0)
#查看填充后数据的最后五行
data.tail()
2.中国数据可视化
此时经过观察数据已不存在空值。可开始挑选数据进行数据可视化画图。
因为我要画的是我过各个省份确诊病例的地图可视化,所以需要的是
省份名(name) 和 累计确诊(total_confirm) 数据
****这里也是地图可视化需要的数据*****
#将提取的数据进行排序
total_data = data[["name","total_confirm"]].sort_values(by="total_confirm",ascending=False)
total_data[:5]
*****以下是输出结果******
name total_confirm
0 湖北 68153
1 香港 11549
2 广东 2295
3 上海 1916
4 黑龙江 1610
2.1 地图可视化
地图可视化的代码
map = (
Map()
.add("商家A", [list(z) for z in zip(total_data["name"],total_data["total_confirm"])], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="中国各省新冠确诊人数数据可视化"),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(
type_="color",
min_=np.min(total_data["total_confirm"].tolist()),
max_=np.max(total_data["total_confirm"].tolist()),
range_text=["High","Low"],is_piecewise=True,
# split_number = 5,
pieces=[{"min": 0, "max": 100, "label": "< 100"},{"min": 100, "max": 500, "label": "100 - 500"},
{"min": 500, "max": 1000, "label": "500 - 1000"},{"min": 1000, "max": 10000, "label": "1000 - 10000"},
{"min": 10000, "max": 20000, "label": "10000 - 20000"},{"min": 20000, "label": "> 20000"}]),
)
)
map.render_notebook()
结果展示
2.2 柱状图可视化
柱状图可视化
//将今日的时间赋值与ntime
ntime = time.strftime("%Y_%m_%d",time.localtime(time.time()))
bar = (
Bar()
.add_xaxis(total_data["name"].tolist())
.add_yaxis("累计确诊", total_data["total_confirm"].tolist())
.set_global_opts(
#图形标题的设置
title_opts=opts.TitleOpts(
title=ntime+"中国各省份累计新冠肺炎确诊病例",
pos_left="center",
pos_top="7%"),
# 'shadow':阴影指示器
tooltip_opts=opts.TooltipOpts(
is_show=True,
trigger="axis",
axis_pointer_type="shadow"),
# 图例的设置
legend_opts=opts.LegendOpts(pos_top="12%",pos_left="45%"),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
type_="color",
min_=np.min(total_data["total_confirm"]),
max_=np.max(total_data["total_confirm"]),
range_text=["High","Low"],),
# x轴坐标配置项
xaxis_opts=opts.AxisOpts(name="省份",axislabel_opts={"interval":"0"}),
# y轴配置项
yaxis_opts=opts.AxisOpts(
name="总计",min_=0,
type_="value",axislabel_opts=opts.LabelOpts(formatter="{value} 人"),),
# 区域缩放配置项
datazoom_opts=opts.DataZoomOpts(range_start=5,range_end=50),
)
)
bar.render_notebook()
结果展示
#增加一列为治愈率的特征
# np.around(data,3)只保留小数后三位数字
data["cure_rate"] = np.around(data["total_heal"]/data["total_confirm"],3)
data["death_rate"] = np.around(data["total_dead"]/data["total_confirm"],3)
data[["name","total_confirm","total_heal","cure_rate","death_rate"]][:10]
******输出结果********
2.3 折线图可视化
折线图可视化
line = (
Line(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS))
.add_xaxis(data["name"].tolist())
.add_yaxis("死亡率", data["death_rate"].tolist(), is_smooth=True,symbol_size=10,symbol="triangle",
# 线条样式配置参数
linestyle_opts=opts.LineStyleOpts(width=3,type_="dotted",color="#6e9ef1"),
itemstyle_opts=opts.ItemStyleOpts(
border_width=3, border_color="yellow", color="blue"
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="中国各省新冠确诊死亡率",pos_left="center",pos_top="2%"),
legend_opts=opts.LegendOpts(pos_top="8%"),
# x轴坐标配置项
xaxis_opts=opts.AxisOpts(name="省份",axislabel_opts={"interval":"0"}),
# y轴配置项
yaxis_opts=opts.AxisOpts(
name="百分比",min_=0,
type_="value",axislabel_opts=opts.LabelOpts(formatter="{value} %"),),
datazoom_opts=opts.DataZoomOpts(range_start=5,range_end=50),
tooltip_opts=opts.TooltipOpts(
is_show=True,
trigger="axis",
axis_pointer_type="shadow"),
)
)
line.render_notebook()
结果展示
图形比较丑,请忽略,主要是为了练习画图函数
3.世界数据可视化
3.1 世界地图可视化
这里是对世界各国及其患病的人数进行了一个地图的可视化,
df = pd.read_csv("./today_worlds_2021_04_09.csv")
df = df.fillna(0)
#提取出我们需要的特征列
world_data = df[["name","lastUpdateTime","today_confirm","total_confirm","total_heal","total_dead"]]
world_data.head()
这里是因为pyecharts不能默认使用中文标注的国名,所以在网上找了一个中英文对应的数据,存储为json格式后在进行引用,防止在代码中出现太长的字典数据的代码。国名中英文数据在文章末尾的链接文章中。
#将其取出后储存为 name_map
with open("./test.json",'r') as f:
name_map = json.load(f)
type(data)
*********输出为***********
pandas.core.frame.DataFrame
世界地图完整代码
world_map = (
Map()
.add("累计新冠确诊",
[list(z) for z in zip(world_data["name"].tolist(), world_data["total_confirm"].tolist())],
"world",is_map_symbol_show=False,name_map=name_map)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="世界各国新冠确诊累计分布图"),
# visualmap_opts=opts.VisualMapOpts(max_=200),
visualmap_opts=opts.VisualMapOpts(
type_="color",
min_=np.min(world_data["total_confirm"]),
max_=np.max(world_data["total_confirm"]),
range_text=["High","Low"],is_piecewise=True,
pieces=[{"min": 0, "max": 100, "label": "< 100"},
{"min": 100, "max": 1000, "label": "100 - 1000"},
{"min": 1000, "max": 10000, "label": "1000 - 10000"},
{"min": 10000, "max": 30000, "label": "1万 - 3万"},
{"min": 30000, "max": 100000, "label": "3万 - 10万"},
{"min": 100000, "max": 200000, "label": "10万 - 20万"},
{"min": 200000, "max": 500000, "label": "20万 - 50万"},
{"min": 500000, "max": 1000000, "label": "50万 - 100万"},
{"min": 1000000, "max": 5000000, "label": "100万 - 500万"},
{"min": 5000000, "max": 20000000, "label": "500万 - 2000万"},
{"min": 20000000, "label": "> 2000万"}]),
)
)
world_map.render_notebook()
结果展示:
3.2 柱状图
#对数据进行排序
total_worlds = world_data[["name","total_confirm"]].sort_values(by="total_confirm",ascending=False)
bar = (
Bar()
.add_xaxis(total_worlds["name"].tolist())
.add_yaxis("累计确诊", total_worlds["total_confirm"].tolist())
.set_global_opts(
#图形标题的设置
title_opts=opts.TitleOpts(
title="世界各国累计新冠肺炎确诊病例",
pos_left="center",
pos_top="7%"),
# 'shadow':阴影指示器
tooltip_opts=opts.TooltipOpts(
is_show=True,
trigger="axis",
axis_pointer_type="shadow"),
# 图例的设置
legend_opts=opts.LegendOpts(pos_top="12%",pos_left="45%"),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
type_="color",
min_=np.min(total_data["total_confirm"]),
max_=np.max(total_data["total_confirm"]),
range_text=["High","Low"],),
# x轴坐标配置项
xaxis_opts=opts.AxisOpts(name="国家",axislabel_opts={"interval":"0"}),
# y轴配置项
yaxis_opts=opts.AxisOpts(
name="总计",min_=0,
type_="value",axislabel_opts=opts.LabelOpts(formatter="{value} 人"),),
# 区域缩放配置项
datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=5),
)
)
bar.render_notebook()
4.总结
1.在这里我只是对爬取到的数据进行了一个大致的可视化分析,并没有深入的对数据进行分析了解,这也是因为我主要是为了熟悉 pyecharts 的画图功能函数。
2.本文画图的代码具体含义请参考官方文档,如果要学习pyecharts画图,官方文档其实就是最好的学习资料。其中的关键就在于如何将组成图形的元素组合起来,然后再加以配色,仅适用pyecharts就可以画出精美的图形了。
3.Pyecharts 学习提示:
- 1、 set_global_opts() — 对全局配置项的代码编写
- 2、 set_series_opts() — 对系列配置项的代码编写
- 3、其次就是对图像框架的代码编写,这也是最简单的