前言javascript
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理。java
PS:若有須要Python學習資料的小夥伴能夠點擊下方連接自行獲取python
Python免費學習資料、代碼以及交流解答點擊便可加入express
plotly是python很是強大的可視化庫,畫出的圖不只精美還數據全面,很是適合拿來畫地圖json
今天教你們用plotly庫繪製房價和地鐵線路分佈圖,經過本次實例,你可以掌握地圖標點、劃線的基本用法網絡
plotly的安裝比較簡單,直接在命令行輸入:app
pip install plotly
而後須要在官網註冊1個token,步驟以下:python爬蟲
1.註冊郵箱登陸:學習
2.依次點擊Token-Create a token,下方就會出現token值:url
pandas讀取房價數據:
import pandas as pd data=pd.read_excel('房價彙總帶經緯度.xlsx') data
房子的經緯度的信息是我根據詳細位置用python爬蟲爬的,感興趣的能夠本身去試一下
調用go.Scattermapbox()方法,繪製房價散點圖:
import plotly.graph_objects as go token='pk.eyJ1IjoicHl0aG9uYmlyZCIsImEiOiJja2tqOTBneXcwZTlyMnRzNzczNngzY2huIn0.2dImfhmc06Z8IeX6WeNamQ' fig=go.Figure(go.Scattermapbox( mode="markers", lon=data.經度, lat=data.緯度, hovertext=data.簡介, #懸停顯示文本內容 hoverinfo='text', marker_symbol='marker', marker_size=6)) #標記大小 fig.update_layout(mapbox={ "accesstoken":token, "center":{'lon':116.2,'lat':39.56}, #地圖中心位置 'zoom':11.8}, margin={'l':0,'r':0,'t':0,"b":0} #地圖邊距 )
go.Scattermapbox()方法提供了多種symbol樣式,網址爲:
https://labs.mapbox.com/maki-icons/
但它只能呈現數據位置,表現的很單一
px.scatter_mapbox()則很好的解決這一問題,可以將marker的size和color與不一樣列的值相關聯,經過數據點的位置、顏色和大小多維度地呈現數據(marker的symbol不可改變):
import plotly.express as px import plotly.graph_objects as go fig = px.scatter_mapbox(data, lon = '經度', #輸入經度座標 lat = '緯度', #輸入緯度 color ="單價", #對應excel的color欄,每一個值表明一種顏色 hover_name ="簡介",#能夠對應excel裏面的某一欄 size_max = 16, #上面size尺寸的最大值 color_continuous_scale = px.colors.carto.Temps ) fig.update_layout(mapbox = {'accesstoken': token, #須要到官網註冊一個token "center":{'lon':116.2,'lat':39.56}, #指定的地圖中心 'zoom': 7.48, 'style': 'dark', #顯示的地圖類型,有遙感地圖,街道地圖等類型 }, margin = {'l': 0, 'r': 0, 't': 0, 'b': 0}) fig.show() #顯示地圖
內置的style能夠是[basic, streets, outdoors, light, dark, satellite, satellite-streets]中的任意一種,默認爲'light'
最後,我又用爬蟲爬了北京市地鐵站點信息,代碼以下:
import requests import json import pandas as pd url='http://map.amap.com/service/subway?_1599997789354=&srhdata=1100_drw_beijing.json' response=requests.get(url) result=json.loads(response.text) stations=[] lats=[] lons=[] lines=[] for i in result['l']: for j in i['st']: lines.append(i['kn']) stations.append(j['n']) lons.append(j['sl'].split(',')[0]) lats.append(j['sl'].split(',')[1]) dataframe=pd.DataFrame({'站名':stations,'線路':lines,'經度':lons,'緯度':lats}) dataframe
在第二張圖的基礎上加上地鐵線路圖:
lines=dataframe['線路'].unique().tolist() for line in lines: fig.add_traces(go.Scattermapbox( mode="markers+lines", lon=dataframe.loc[lambda x:x['線路']==line]['經度'], lat=dataframe.loc[lambda x:x['線路']==line]['緯度'], hovertext=dataframe.loc[lambda x:x['線路']==line]['站名'], hoverinfo='text', marker_symbol='marker', marker_size=6, showlegend = False)) for line in lines[1:]: fig.add_traces(go.Scattermapbox( mode="markers+lines", lon=dataframe.loc[lambda x:x['線路']==line]['經度'], lat=dataframe.loc[lambda x:x['線路']==line]['緯度'], hovertext=dataframe.loc[lambda x:x['線路']==line]['站名'], hoverinfo='text', marker_symbol='marker', marker_size=6, showlegend = False)) fig.update_layout(mapbox={"accesstoken":token,"center":{'lon':116.2,'lat':39.56},'zoom':11.8}, margin={'l':0,'r':0,'t':0,"b":0})
大功告成,你學會了嗎?