1. 程式人生 > 程式設計 >Pyecharts繪製全球流向圖的示例程式碼

Pyecharts繪製全球流向圖的示例程式碼

安裝

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"),("Ukraine",("Kazakhstan",type_= GeoType.LINES,)

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如下圖所示。

world_country

它是一個各個國家的名稱及座標點檔案。匯入之後就可以新增資料項了。

還可以直接把這個檔案追加到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)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。