我又来了,上午分享了个小爬虫
现在来弄弄数据可视化
网上找了份早期的疫情数据:<<截至2月17日22时37分疫情数据>>
资料比较早,将就用
做出来的是动态的html文件
源码我都会放在附件里有需要的可以下载
先分析湖北省内数据,绘制流向图
# 导入流向地图绘制
from pyecharts.charts import Geo
# 导入配置模块
import pyecharts.options as opts
# 1、实例化对象
geo = Geo(
# 初始化设置
init_opts=opts.InitOpts(
#
width='100%',
height='900px',
theme='chalk', # 主题
page_title='流向地图', # 网页名称
)
)
# 2、添加数据
# 添加类型
geo.add_schema(
maptype='湖北', # 地图类型,如果为中国地图--china, 世界---world
is_roam=True, # 开启缩放
# 地图样式
itemstyle_opts=opts.ItemStyleOpts(
border_color='#228B22', # 地图边缘颜色
area_color='#FF8C00', # 地图区域颜色
)
)
# 准备数据
# 构建武汉封城前的出入数据 (湖北省内数据)
# 出--代表从武汉--->该城市
# 入--代表从该城市--->武汉
data_0120_ru = '孝感、黄冈、鄂州、荆州、黄石、襄阳'
data_0120_chu = '孝感、黄冈、荆州、襄阳、黄石、荆门、鄂州、随州、仙桃'
data_0121_ru = '孝感、黄冈、荆州、鄂州、黄石'
data_0121_chu = '孝感、黄冈、荆州、襄阳、荆门、黄石、随州、鄂州、仙桃'
data_0122_ru = '孝感、黄冈、鄂州、荆州、咸宁、黄石'
data_0122_chu = '孝感、黄冈、荆州、襄阳、荆州、随州、宜昌、黄石、鄂州'
# data_pair = [(出,入),(出,入),....] 格式
# 入武汉: [('孝感','武汉'),('黄冈','武汉'),...]
# 出武汉: [('武汉','孝感'),('武汉','黄冈')]
#
data_ru = []
# 处理入武汉
for city_str in (data_0120_ru, data_0121_ru, data_0122_ru):
# print('city_str:', city_str) #
# 对每一个 city_str 再进行处理
city_list = city_str.split('、')
# 构建迁徙路线
for city in city_list:
data_ru.append((city, '武汉'))
# print('data_ru:\n', data_ru)
#
data_chu = []
for city_str in (data_0120_chu, data_0121_chu, data_0122_chu):
# print('city_str:', city_str) #
# 对每一个 city_str 再进行处理
city_list = city_str.split('、')
# 构建迁徙路线
for city in city_list:
data_chu.append(('武汉', city))
# print('data_chu:\n', data_chu)
# 组合路线
data_pair_city = data_ru + data_chu
# print('data_pair_city:\n', data_pair_city)
# print('data_pair_city:\n', len(data_pair_city))
# 对 data_pair_city 去重
data_pair_city = list(set(data_pair_city))
print('data_pair_city:\n', data_pair_city)
print('data_pair_city:\n', len(data_pair_city))
# 添加数据
geo.add(
series_name='', # 系列名称
data_pair=data_pair_city, # 数据项 ----[(k,v),(k,v),....]
# 迁徙路线的类型
type_='lines',
# type_='effectScatter',
# 涟漪特效
effect_opts=opts.EffectOpts(
is_show=True, # 显示特效
brush_type='stroke', # 波纹的绘制方式
# brush_type='Scatter', # 波纹的绘制方式
color='#FFD700', # 特效颜色
symbol='arrow', # 箭头 ---特效图形
# symbol='pin', # 圆圈 ---特效图形
symbol_size=10, # 特效标记的大小
# period=4,
# scale=5,
),
# 线的样式
linestyle_opts=opts.LineStyleOpts(
# 线的弯曲程度
curve=0.3,
# 线的类型
type_='dashed',
# 线的颜色
color='#A52A2A'
)
)
# 3、全局配置
geo.set_global_opts(
# 标题
title_opts=opts.TitleOpts(
title='武汉封城前流向地图',
# subtitle='广州Python0624全体',
pos_left='center',
pos_top='5%',
title_textstyle_opts=opts.TextStyleOpts(
font_size=40
)
),
# 图例
legend_opts=opts.LegendOpts(
is_show=False
),
# 文本设置 ---借助原生组件元素设置
graphic_opts=opts.GraphicGroup(
# 控制文本相对于整体的位置
graphic_item=opts.GraphicItem(
#
left='75%',
top='5%'
),
# 设置文本
children=[
# # 设置文本框
# opts.GraphicRect(
#
# ),
# 设置文本
opts.GraphicText(
# 配置的文本相对于 --->文本框的位置
graphic_item=opts.GraphicItem(
left='center', # 文本相对于文本框的左位置
top='middle', # 文本相对文本框的上位置
z=100, # 字在文本框的z轴方向100的位置
scale=[2.5, 2.5], # [横向缩放的倍数, 纵向缩放的倍数]
),
# 设置文本内容
graphic_textstyle_opts=opts.GraphicTextStyleOpts(
# 文本内容
text="""截止2020-01-22日\n武汉封城前的迁徙路线\n作者:a11040427""",
font='13px Microsoft YaHei', # 字体
text_align='left', # 水平对其方式: 左对齐
text_vertical_align='middle', # 垂直对其方式:居中
# 图形化基本设置
graphic_basicstyle_opts=opts.GraphicBasicStyleOpts(
fill='#ffdf22' # 设置颜色
)
)
)
]
)
)
# 4、系列配置
geo.set_series_opts(
# 标签设置
label_opts=opts.LabelOpts(
is_show=False
)
)
# 5、生成图像
geo.render('./html/流向地图.html')
再分析全国和全世界数据
我嫌重复写代码麻烦
就把两张图放在同一张画布里了
import pandas as pd
from pyecharts.charts import Map, Page
from pyecharts import options as opts
# 导入翻译模块
from translate import Translator
# ========================================================================================================================中国地图绘制 ================================================
# 加载数据
data = pd.read_excel('./data/截至2月17日22时37分疫情数据.xls')
# print('data:\n', data)
# print('data:\n', data.columns)
# 获取中国各个省的数据
# 构建bool数组
mask = data.loc[:, '城市'] == data.loc[:, '省份']
# 筛选数据
data = data.loc[mask, ['省份', '确诊数']]
print('data:\n', data)
# 准备data_pair
data_pair = [(k, v) for k, v in zip(data.loc[:, '省份'].tolist(), data.loc[:, '确诊数'].tolist())]
print('data_pair:\n', data_pair)
# 绘制中国地图
# 1、实例化对象
map_china = Map(
# 初始化配置
init_opts=opts.InitOpts(
#
width='800px',
height='500px',
theme='chalk',
page_title='中国地图',
)
)
# 2、添加数据
map_china.add(
series_name='截至2月17日22时37分疫情数据',
data_pair=data_pair, # [(k,v),(k,v),....]
maptype='china', # 地图类型
is_map_symbol_show=False
)
# 3、全局配置
map_china.set_global_opts(
# 标题
title_opts=opts.TitleOpts(
title='2020年中国疫情数据',
subtitle='作者:a11040427',
pos_top='3%',
pos_left='5%'
),
# 图例
legend_opts=opts.LegendOpts(
is_show=True,
pos_top='3%',
pos_left='center'
),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 显示视觉映射配置
type_='color', # 类型,使用颜色来区分不同的值
min_=0,
max_=60000,
is_piecewise=True, # 分段型
pieces=[
{"min": 10001, "label": ">10000", "color": "#4b0101"},
{"max": 10000, "min": 5001, "label": ">5000", "color": "#4a0100"},
{"max": 5000, "min": 1001, "label": ">1000", "color": "#8A0808"},
{"max": 1000, "min": 500, "label": "500-1000", "color": "#B40404"},
{"max": 499, "min": 100, "label": "100-499", "color": "#DF0101"},
{"max": 99, "min": 10, "label": '10-99', "color": "#F78181"},
{"max": 9, "min": 1, "label": "1-9", "color": "#F5A9A9"},
{"max": 0, "min": 0, "label": "0", "color": "#FFFFFF"},
],
# 映射标签的字体设置
textstyle_opts=opts.TextStyleOpts(
color='white'
)
)
)
# 4、系列配置
map_china.set_series_opts(
# 标签
label_opts=opts.LabelOpts(
is_show=True
)
)
data_pair = [('China', 70642), ('Singapore', 77), ('Japan', 519), ('South Korea', 30), ('Thailand', 35),
('Malaysia', 22), ('Germany', 16), ('US', 15), ('Vietnam', 16), ('France', 12), ('Canada', 8),
('Australia', 15), ('United Arab Emirates', 9), ('Italy', 3), ('Spain', 2), ('Nepal', 1), ('Sri Lanka', 1),
('UK', 9), ('Swedish', 1), ('Philippines', 3), ('Egypt', 1), ('Cambodia', 1), ('Finland', 1), ('India', 3),
('Russia', 2), ('Belgium', 1)]
print('data_pair:\n', data_pair)
# 1、实例化对象
map_world = Map(
# 初始化配置
init_opts=opts.InitOpts(
#
width='800px',
height='500px',
theme='chalk',
page_title='世界地图',
)
)
# 2、添加数据
map_world.add(
series_name='截至2月17日22时37分疫情数据',
data_pair=data_pair,
maptype='world',
is_map_symbol_show=False
)
# 3、全局配置
map_world.set_global_opts(
# 标题
title_opts=opts.TitleOpts(
title='2020年世界疫情数据',
subtitle='作者:a11040427',
pos_top='3%',
pos_left='5%'
),
# 图例
legend_opts=opts.LegendOpts(
is_show=True,
pos_top='3%',
pos_left='center'
),
# 视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
is_show=True, # 显示视觉映射配置
type_='color', # 类型,使用颜色来区分不同的值
min_=0,
max_=60000,
is_piecewise=True, # 分段型
pieces=[
{"min": 9999, "label": ">9999", "color": "#4b0101"},
{"max": 9998, "min": 100, "label": "100-9998", "color": "#4a0100"},
{"max": 99, "min": 40, "label": "40-99", "color": "#8A0808"},
{"max": 39, "min": 30, "label": "30-39", "color": "#B40404"},
{"max": 29, "min": 20, "label": "20-29", "color": "#DF0101"},
{"max": 19, "min": 10, "label": '10-19', "color": "#F78181"},
{"max": 9, "min": 1, "label": "1-9", "color": "#F5A9A9"},
{"max": 0, "min": 0, "label": "0", "color": "#FFFFFF"},
],
# 映射标签的字体设置
textstyle_opts=opts.TextStyleOpts(
color='white'
)
)
)
# 4、系列配置
map_world.set_series_opts(
# 标签
label_opts=opts.LabelOpts(
is_show=False
)
)
# 顺序多图 ---Page
# 1、实例化 Page 对象
page = Page(
page_title='组合中国地图、世界地图',
interval=1,
layout=Page.DraggablePageLayout # 布局
)
# 2、添加数据
page.add(map_china)
page.add(map_world)
# 3、生成图像
page.render('./html/组合中国地图、世界地图.html')