Mapbox是新一代的地圖資料,只以媲美Google Map,且使用者不需付費,可以完全取代Google 地圖。缺點為地址有些是英文,有些是中文,待日後能更加完善。
Mapbox圖層
Mapbox共分為三個圖層
1. 底層 : base map,就是繪制地圖的地方。由 layout.mapbox.style定義
2. 軌跡層 : trace,繪製軌跡圖層,位於底層上方
3. 其它圖層 : 位於軌跡層上方,由 layout.mapbox.layers 定義更多圖層,為陣列格式。
存取權杖
請到 https://mapbox.com/ 註冊帳號,然後取得存取權杖(一組金鑰)。如果layout.mapbox.style不需從Mapbox service 使用資料的話,就不需權杖。
OpenStreetMap
此圖層樣式不需權杖。底下為簡易範例
import pandas as pd us_cities = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/us-cities-top-1k.csv") import plotly.express as px fig = px.scatter_mapbox(us_cities, lat="lat", lon="lon", hover_name="City", hover_data=["State", "Population"], color_discrete_sequence=["fuchsia"], zoom=4) fig.update_layout(mapbox_style="open-street-map") fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()
COVID-19分佈圖
上面的資料,是plotly官方提供的,不太適合台灣學生的需求。所以本人提供一組台灣地圖的經緯度給大家測試,不過裏面的資料是假的啦,共100 多組經緯度。
請注意,註明編碼可用如下二種。不過本例已改成由資料庫提取,所以不需加此編碼方式。
# -*- coding:utf-8 -*-
或
# coding=utf-8
# -*- coding: utf-8 -*- #coding=utf-8 import pandas as pd import plotly.express as px import mysql.connector as mysql conn=mysql.connect(host="mahaljsp.asuscomm.com", user="xxx", password="xxxxx", database="資料庫") cursor=conn.cursor() cursor.execute("select * from covid19") rs=cursor.fetchall() cols=[d[0] for d in cursor.description] df=pd.DataFrame(data=rs, columns=cols) fig=px.scatter_mapbox( data_frame=df, lat="lat", lon="lng", hover_name="cov_date", hover_data=["area","address"], color_discrete_sequence=["fuchsia"], zoom=12 ) #open-street-map : 免費,不用權杖,較不美觀 fig.update_layout(mapbox_style='open-street-map') fig.update_layout(margin=dict(l=0, t=0, r=0, b=0)) fig.show()
strees樣式
上述的open-street-map樣式,說真的超醜的。其實有另一個精美的地圖,叫 “strees”。此地圖樣式需要權杖,所以請先到mapbox官網申請帳號及權杖。
底下代碼,會存取本站的資料庫,其帳號密碼將於上課時公佈。在此不予公告,敬請見諒。
完整代碼及範例如下
import pandas as pd import mysql.connector as mysql import plotly.express as px import plotly pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) pd.set_option('display.width', None) pd.set_option('display.max_colwidth', None) conn=mysql.connect(host="ip", user='帳號', password='密碼', database='cloud') cursor=conn.cursor() cursor.execute("select * from covid19") rs=cursor.fetchall() cols = [d[0] for d in cursor.description] df=pd.DataFrame(data=rs, columns=columns) px.set_mapbox_access_token("pk.xxxxx...........NFs6Tw") #請申請權杖 fig = px.scatter_mapbox(df, lat="lat", lon="lng", hover_name="cov_date", hover_data=["area", "address"], color_discrete_sequence=["fuchsia"], zoom=10) fig.update_layout(mapbox_style="streets") fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) plotly.offline.plot(fig, filename='mapbox_1.html', auto_open=False) fig.show()
底下的地圖,是不是精美多了呢!! 比較麻煩的是要申請權杖,但是免費的!!
Plotly
使用plotly也可以繪制mapbox,而且可以更改makers。
hoverinfo 為滑鼠移入時,要顯示的資料。在 go.Scattermapbox 裏,可以填入 lat,lng,text,name 四個參數,所以如果要顯示地址的話,就把地址放在 addr 的 list 中,然後把 text 指向 addr,hoverinfo 再指向 text
import pandas as pd import plotly import plotly.express as px
import numpy as np
import plotly.graph_objs as go
pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) pd.set_option('display.width', None) pd.set_option('display.max_colwidth', None) import mysql.connector as mysql conn=mysql.connect(host='ip', user='account', password='password', database='cloud') cursor=conn.cursor() cmd="select * from covid19" cursor.execute(cmd) rs=cursor.fetchall() cols=[d[0] for d in cursor.description]
df=pd.DataFrame(data=rs, columns=cols)
token="pk.eyJ......iZfVw" # 自已申請 #symbol : 有一些預設的圖,但有的不能用 # symbol 網址 : 有些不能用。https://labs.mapbox.com/maki-icons/ fig=go.Figure(go.Scattermapbox( lat=df["lat"], lon=df["lng"], mode='markers', text=df["address"],
hovertext=df["address"],#可以是外面的list資料
hoverinfo='text',#只能使用 lat, lon, text, name四個選項 marker=dict(symbol='rocket', size=20),
#cluster=dict(enabled=True)#群組,相近的點成一群,mode及marker 必需取消才有效 )) fig.update_layout( hovermode='closest', mapbox=dict( accesstoken=token, bearing=0,#旋轉 center=go.layout.mapbox.Center( lat=df["lat"].mean(), lon=df["lng"].mean() ), zoom=10, ), mapbox_style='streets', margin={"r":0, "l":0, "t":0, "b":0} ) fig.show()
有關可使用的圖示請參照官網的說明 https://labs.mapbox.com/maki-icons/。官網所列出的圖示,有些能用,有些不能用。
''' airfield airport alcohol-shop amusement-park aquarium art-gallery attraction bakery bank bar beer bicycle bicycle-share bus cafe campsite car castle cemetery cinema circle circle-stroked clothing-store college dentist doctor dog-park drinking-water embassy entrance fast-food ferry fire-station fuel garden golf grocery harbor heliport hospital ice-cream information laundry library lodging marker monument mountain museum music park pharmacy picnic-site place-of-worship playground police post prison rail rail-light rail-metro religious-christian religious-jewish religious-muslim restaurant rocket school shop stadium star suitcase swimming theatre toilet town-hall triangle triangle-stroked veterinary volcano zoo '''