Mapbox with plotly

      在〈Mapbox with plotly〉中尚無留言

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
'''

請參照官網 : https://plotly.com/python/mapbox-layers/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *