Pyecharts绘制全球流向图的示例代码
作者:wwxxee 发布时间:2021-04-30 14:52:56
安装
pip(3) install pyecharts
此文版本为v1.6
此文版本为v1.6
此文版本为v1.6
效果图
使用Pycharts绘制一个如上图类似的全球流向图。
pyecharts里的地理图标总共有三种—
Geo:地理坐标系,Map:地图,Bmap:百度地图。
Map地图可以绘制全球地图,但不能绘制带有流向的效果图,所以此处需要使用Geo地理坐标系图。
Geo图的类型有scatter(散点图),effectScatter(涟漪散点图),heatmap(热力图),lines(流向图)。
散点图不用说,就是正常的散点图。涟漪散点图类似带有波纹的散点图,像水的涟漪效果一样。
效果如下:
热力图也不用说,就是正常的热力图效果。
我们需要绘制的是流向图。
# 导入Geo包,注意1.x版本的导入跟0.x版本的导入差别
from pyecharts.charts import Geo
# 导入配置项
from pyecharts import options as opts
# ChartType:图标类型,SymbolType:标记点类型
from pyecharts .globals import ChartType, SymbolType
geo = Geo()
# 地图类型,世界地图可换为world
geo.add_schema(maptype="china")
# 添加数据点
geo.add("",[("北京",10),("上海",20),("广州",30),("成都",40),("哈尔滨",50)],type_=ChartType.EFFECT_SCATTER)
# 添加流向,type_设置为LINES,涟漪配置为箭头,提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle',
#'diamond', 'pin', 'arrow', 'none'
geo.add("geo-lines",
[("上海","广州"),
("上海","新疆"),
("上海","哈尔滨"),
("成都","北京"),
("哈尔滨","广州")],
type_=ChartType.LINES,
effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW,symbol_size=5,color="yellow"),
linestyle_opts=opts.LineStyleOpts(curve=0.2),
is_large=True)
# 不显示标签
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 设置图标标题,visualmap_opts=opts.VisualMapOpts()为左下角的视觉映射配置项
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(),title_opts=opts.TitleOpts(title="Geo-Lines"))
# 直接在notebook里显示图表
geo.render_notebook()
# 生成html文件,可传入位置参数
geo.render("mychart.html")
效果如图:
在绘制国内的流向图的时候是没有问题的,但是当我们把地点换为国际城市或者其他国家的时候就是报错了。
因为Geo图的坐标引用自pyecharts.datasets.city_coordinates.json。我们打开这和文件可以看到国内的城市坐标。这个文件里的全部数据都是国内的城市,当我们想绘制全球的流向图的时候,Geo引用找不到国际地点就i会报错了。
解决办法有两个:
1.新增坐标点
def add_coordinate(
# 坐标地点名称
name: str,
# 经度
longitude: Numeric,
# 纬度
latitude: Numeric,
)
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts .globals import ChartType, SymbolType, GeoType
geo = Geo()
# 新增坐标点,添加名称跟经纬度
geo.add_coordinate(name="China",longitude=104.195,latitude=35.675)
geo.add_coordinate(name="Australia",longitude=133.775,latitude=-25.274)
geo.add_coordinate(name="Brazil",longitude=-51.925,latitude=-14.235)
geo.add_coordinate(name="South Africa",longitude=22.937,latitude=-30.559)
geo.add_coordinate(name="India",longitude=78.962,latitude=20.593)
geo.add_coordinate(name="Peru",longitude=-75.015,latitude=-9.189)
geo.add_coordinate(name="Iran",longitude=53.688,latitude=32.427)
geo.add_coordinate(name="Ukraine",longitude=31.165,latitude=48.379)
geo.add_coordinate(name="Canada",longitude=-106.346,latitude=56.130)
geo.add_coordinate(name="Mongolia",longitude=103.847,latitude=46.862)
geo.add_coordinate(name="Russia",longitude=37.618,latitude=55.751)
geo.add_coordinate(name="Mauritania",longitude=21.008,latitude=-10.941)
geo.add_coordinate(name="Kazakhstan",longitude=66.924,latitude=48.019)
geo.add_coordinate(name="UAE",longitude=53.848,latitude=23.424)
geo.add_coordinate(name="Malaysia",longitude=101.976,latitude=4.210)
geo.add_coordinate(name="New Zealand",longitude=174.886,latitude=-40.900)
geo.add_coordinate(name="Indonesia",longitude=113.921,latitude=-0.789)
geo.add_coordinate(name="Sweden",longitude=18.643,latitude=60.128)
geo.add_coordinate(name="Mexico",longitude=-102.553,latitude=23.634)
geo.add_coordinate(name="Sierra Leone",longitude=-11.779,latitude=8.461)
# 添加数据项
geo.add_schema(maptype="world")
geo.add("",[("Australia",128326),
("Brazil",44037),
("South Africa",7649),
("India",3562),
("Peru",2779),
("Iran",2698),
("Ukrainie",2040),
("Canada",1792),
("Mongolia",1514),
("Russia",1069),
("Mauritania",1374),
("Kazakhsan",701),
("UAE",490),
("Malaysia",554),
("New Zealand",422),
("Indonesia",148),
("Sweden",113),
("Mexico",121),
("Sierra Leone",109),
],type_=ChartType.EFFECT_SCATTER)
# 绘制流向
geo.add("流向图",[
("Australia","China"),
("Brazil","China"),
("South Africa","China"),
("India","China"),
("Peru","China"),
("Iran","China"),
("Ukraine","China"),
("Canada","China"),
("Mongolia","China"),
("Russia","China"),
("Mauritania","China"),
("Kazakhstan","China"),
("UAE","China"),
("Malaysia","China"),
("New Zealand","China"),
("Indonesia","China"),
("Sweden","China"),
("Mexico","China"),
("Sierra Leone","China"),
],
type_= GeoType.LINES,
effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW,symbol_size=5,color="yellow"),
linestyle_opts=opts.LineStyleOpts(curve=0.2),
)
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=130000),title_opts=opts.TitleOpts(title="mygeo"))
geo.render()
效果如下:颜色表示各数据点大小。(用线条粗细表示大小还不知道,知道的盆友可以告诉我)
这种添加坐标点的办法太麻烦了,需要手动一个个添加,十分不方便。
2.添加坐标点文件。
以JSON文件格式批量新增坐标点。
def add_coordinate_json(
# json 文件格式的坐标数据
# 格式如下
# {
# "阿城": [126.58, 45.32],
# "阿克苏": [80.19, 41.09]
# }
json_file: str
)
如果我们有一份全球的数据坐标点文件我们就可以使用这个添加文件的方式批量导入坐标点。
geo.add_coordinate_json(json_file="world_country.json")
可以直接用这一步替代添加坐标点的步骤。
world_country.json如下图所示。
它是一个各个国家的名称及坐标点文件。导入之后就可以添加数据项了。
还可以直接把这个文件追加到pyechats.datasets.city_coordinates.json文件里 ,这样就可以一劳永逸,下次直接写国家名称的时候就可以读取到。
绘制全球流向图就完成了。
其他细节可以参考官方文档:http://pyecharts.org/#/zh-cn/
渲染成图片
API:
def make_snapshot(
# 渲染引擎,可选 selenium 或者 phantomjs
engine: Any,
# 传入 HTML 文件路径
file_name: str,
# 输出图片路径
output_name: str,
# 延迟时间,避免图还没渲染完成就生成了图片,造成图片不完整
delay: float = 2,
# 像素比例,用于调节图片质量
pixel_ratio: int = 2,
# 渲染完图片是否删除原 HTML 文件
is_remove_html: bool = False,
# 浏览器类型,目前仅支持 Chrome, Safari,使用 snapshot-selenium 时有效
browser: str = "Chrome",
**kwargs,
)
使用:
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot
make_snapshot(snapshot,"全球流向.html","流向2.png",delay=5)
来源:https://blog.csdn.net/weixin_42633229/article/details/103878985
猜你喜欢
- 描述max() 方法返回给定参数的最大值,参数可以为序列。语法以下是 max() 方法的语法:max( x, y, z, .... )参数x
- 本文实例讲述了Python使用pyautocad+openpyxl处理cad文件。分享给大家供大家参考,具体如下:示例1:from pyau
- 1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表
- 在了解XHTML代码规范后,我们就要进行CSS布局。首先先介绍一些CSS的入门知识。如果你已经很熟悉了,可以跳过这一节。CSS是Cascad
- 1、给定的日期格式相同,则使用简单的比较运算符来比较日期。<?php//声明两个日期、初始化$date1 = "2021-1
- 数据库中有user表如下:新建一个Django项目:django-admin.py startproject myDjango<pro
- 如图所示,要处理的数据是一个json数组,而且非常大下图为电脑配置,使用 json.load() 方法加载上述json文件电脑直接卡死解决思
- 前言对Python游戏有所了解的朋友都知道,在2D的游戏制作中,经常会用到一个模块pygame,他能帮助我们实现很多方便使用的功能,例如绘制
- 在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值解决方法:1. 修改被除数的值为带小数点的形式即可得到浮点值2.在
- Python程序能用很多方式处理日期和时间。转换日期格式是一个常见的例行琐事。Python有一个 time 和 calendar 模组可以帮
- 一、问题实现对文本的分句,大致来说主要是以中文的句号、感叹、问号等符号进行分句。难点在于直接分句可能会造成人物说话的语句也被分开!二、步骤分
- 大多数程序员考虑编程时,他们都要设想用于编写应用程序的 命令式样式和技术。最受欢迎的通用编程语言(包括 Python 和其它面向对象的语言)
- 对Python中正则表达式的理解,主要就是对符号的理解,本文即对Python中常用的正则表达式符号进行简析。其主要的符号有:.默认匹配一个字
- 以下是SQL连接代码: 代码如下:Function Open_conn() dim Conn,Strconn&
- Python在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题。常见的经典Pyth
- *args与**kwarsg及闭包和装饰器过程先理解闭包,再理解装饰器,不要忘了不定长参数def func():
- Socket是什么Socket是一个抽象层,连接了应用层与传输层,是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TC
- 说明字符串驻留是一种仅保存一份相同且不可变字符串的方法。不同的值被存放在字符串驻留池中,发生驻留之后, 许多变量可能指向内存中的相同字符串对
- 最近写一个小爬虫,需要拿到邮箱信息,发现拿不到,也不是ajax接口。最后查资料发现是被Cloudflare加密起来了,有加密肯定有解密。通过
- 选择最实用来谈一下首先,你要慎重选择你就业的城市。这点是目前多数人都忽略的重要因素。无论你的设计思路和发展方向都要依托你所在城市来作为载体。