Pyecharts繪制全球流向圖的示例代碼
安裝
pip(3) install pyecharts
此文版本為v1.6
此文版本為v1.6
此文版本為v1.6
效果圖

使用Pycharts繪制一個(gè)如上圖類似的全球流向圖。
pyecharts里的地理圖標(biāo)總共有三種—
Geo:地理坐標(biāo)系,Map:地圖,Bmap:百度地圖。
Map地圖可以繪制全球地圖,但不能繪制帶有流向的效果圖,所以此處需要使用Geo地理坐標(biāo)系圖。
Geo圖的類型有scatter(散點(diǎn)圖),effectScatter(漣漪散點(diǎn)圖),heatmap(熱力圖),lines(流向圖)。
散點(diǎn)圖不用說(shuō),就是正常的散點(diǎn)圖。漣漪散點(diǎn)圖類似帶有波紋的散點(diǎn)圖,像水的漣漪效果一樣。
效果如下:

熱力圖也不用說(shuō),就是正常的熱力圖效果。
我們需要繪制的是流向圖。
# 導(dǎo)入Geo包,注意1.x版本的導(dǎo)入跟0.x版本的導(dǎo)入差別
from pyecharts.charts import Geo
# 導(dǎo)入配置項(xiàng)
from pyecharts import options as opts
# ChartType:圖標(biāo)類型,SymbolType:標(biāo)記點(diǎn)類型
from pyecharts .globals import ChartType, SymbolType
geo = Geo()
# 地圖類型,世界地圖可換為world
geo.add_schema(maptype="china")
# 添加數(shù)據(jù)點(diǎn)
geo.add("",[("北京",10),("上海",20),("廣州",30),("成都",40),("哈爾濱",50)],type_=ChartType.EFFECT_SCATTER)
# 添加流向,type_設(shè)置為L(zhǎng)INES,漣漪配置為箭頭,提供的標(biāo)記類型包括 '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)
# 不顯示標(biāo)簽
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
# 設(shè)置圖標(biāo)標(biāo)題,visualmap_opts=opts.VisualMapOpts()為左下角的視覺(jué)映射配置項(xiàng)
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(),title_opts=opts.TitleOpts(title="Geo-Lines"))
# 直接在notebook里顯示圖表
geo.render_notebook()
# 生成html文件,可傳入位置參數(shù)
geo.render("mychart.html")
效果如圖:

在繪制國(guó)內(nèi)的流向圖的時(shí)候是沒(méi)有問(wèn)題的,但是當(dāng)我們把地點(diǎn)換為國(guó)際城市或者其他國(guó)家的時(shí)候就是報(bào)錯(cuò)了。
因?yàn)镚eo圖的坐標(biāo)引用自pyecharts.datasets.city_coordinates.json。我們打開這和文件可以看到國(guó)內(nèi)的城市坐標(biāo)。這個(gè)文件里的全部數(shù)據(jù)都是國(guó)內(nèi)的城市,當(dāng)我們想繪制全球的流向圖的時(shí)候,Geo引用找不到國(guó)際地點(diǎn)就i會(huì)報(bào)錯(cuò)了。

解決辦法有兩個(gè):
1.新增坐標(biāo)點(diǎn)
def add_coordinate( # 坐標(biāo)地點(diǎn)名稱 name: str, # 經(jīng)度 longitude: Numeric, # 緯度 latitude: Numeric, )
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts .globals import ChartType, SymbolType, GeoType
geo = Geo()
# 新增坐標(biāo)點(diǎn),添加名稱跟經(jīng)緯度
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)
# 添加數(shù)據(jù)項(xiàng)
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()
效果如下:顏色表示各數(shù)據(jù)點(diǎn)大小。(用線條粗細(xì)表示大小還不知道,知道的盆友可以告訴我)

這種添加坐標(biāo)點(diǎn)的辦法太麻煩了,需要手動(dòng)一個(gè)個(gè)添加,十分不方便。
2.添加坐標(biāo)點(diǎn)文件。
以JSON文件格式批量新增坐標(biāo)點(diǎn)。
def add_coordinate_json(
# json 文件格式的坐標(biāo)數(shù)據(jù)
# 格式如下
# {
# "阿城": [126.58, 45.32],
# "阿克蘇": [80.19, 41.09]
# }
json_file: str
)
如果我們有一份全球的數(shù)據(jù)坐標(biāo)點(diǎn)文件我們就可以使用這個(gè)添加文件的方式批量導(dǎo)入坐標(biāo)點(diǎn)。
geo.add_coordinate_json(json_file="world_country.json")
可以直接用這一步替代添加坐標(biāo)點(diǎn)的步驟。
world_country.json如下圖所示。

它是一個(gè)各個(gè)國(guó)家的名稱及坐標(biāo)點(diǎn)文件。導(dǎo)入之后就可以添加數(shù)據(jù)項(xiàng)了。
還可以直接把這個(gè)文件追加到pyechats.datasets.city_coordinates.json文件里 ,這樣就可以一勞永逸,下次直接寫國(guó)家名稱的時(shí)候就可以讀取到。
繪制全球流向圖就完成了。
其他細(xì)節(jié)可以參考官方文檔:http://pyecharts.org/#/zh-cn/
渲染成圖片
API:
def make_snapshot( # 渲染引擎,可選 selenium 或者 phantomjs engine: Any, # 傳入 HTML 文件路徑 file_name: str, # 輸出圖片路徑 output_name: str, # 延遲時(shí)間,避免圖還沒(méi)渲染完成就生成了圖片,造成圖片不完整 delay: float = 2, # 像素比例,用于調(diào)節(jié)圖片質(zhì)量 pixel_ratio: int = 2, # 渲染完圖片是否刪除原 HTML 文件 is_remove_html: bool = False, # 瀏覽器類型,目前僅支持 Chrome, Safari,使用 snapshot-selenium 時(shí)有效 browser: str = "Chrome", **kwargs, )
使用:
from pyecharts.render import make_snapshot from snapshot_selenium import snapshot make_snapshot(snapshot,"全球流向.html","流向2.png",delay=5)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程
dddd_ocr是一個(gè)用于識(shí)別驗(yàn)證碼的開源庫(kù),又名帶帶弟弟ocr,下面這篇文章主要給大家介紹了關(guān)于Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
詳解appium+python 啟動(dòng)一個(gè)app步驟
這篇文章主要介紹了詳解appium+python 啟動(dòng)一個(gè)app步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
手把手教你用Python打造互動(dòng)式中秋節(jié)慶祝小程序
中秋節(jié)將至,本文提供了一個(gè)使用Python開發(fā)的中秋節(jié)慶祝小程序教程,通過(guò)簡(jiǎn)單的步驟,您可以創(chuàng)建一個(gè)具有節(jié)日祝福、互動(dòng)式燈謎游戲和模擬中秋明月動(dòng)態(tài)背景的小程序,文章詳細(xì)介紹了程序的功能、實(shí)現(xiàn)步驟以及如何運(yùn)行程序,需要的朋友可以參考下2024-09-09
pandas 數(shù)據(jù)結(jié)構(gòu)之Series的使用方法
這篇文章主要介紹了pandas 數(shù)據(jù)結(jié)構(gòu)之Series的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python日志無(wú)延遲實(shí)時(shí)寫入的示例
今天小編就為大家分享一篇Python日志無(wú)延遲實(shí)時(shí)寫入的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python用正則表達(dá)式實(shí)現(xiàn)爬取古詩(shī)文網(wǎng)站信息
這篇文章主要給大家介紹了關(guān)于Python如何利用正則表達(dá)式爬取爬取古詩(shī)文網(wǎng)站信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

