python繪制高顏值房價與地鐵線路分布圖
今天教大家用plotly庫繪制房價和地鐵線路分布圖,通過本次實例,你能夠掌握地圖標(biāo)點(diǎn)、劃線的基本用法
plotly的安裝比較簡單,直接在命令行輸入:
pip install plotly然后需要在官網(wǎng)注冊1個token,步驟如下:
1.注冊郵箱登錄:

2.依次點(diǎn)擊Token-Create a token,下方就會出現(xiàn)token值:

pandas讀取房價數(shù)據(jù):
import pandas as pd
data=pd.read_excel('房價匯總帶經(jīng)緯度.xlsx')
data

房子的經(jīng)緯度的信息是我根據(jù)詳細(xì)位置用python爬蟲爬的,感興趣的可以自己去試一下
調(diào)用go.Scattermapbox()方法,繪制房價散點(diǎn)圖:
import plotly.graph_objects as go
token='pk.eyJ1IjoicHl0aG9uYmlyZCIsImEiOiJja2tqOTBneXcwZTlyMnRzNzczNngzY2huIn0.2dImfhmc06Z8IeX6WeNamQ'
fig=go.Figure(go.Scattermapbox(
mode="markers",
lon=data.經(jīng)度,
lat=data.緯度,
hovertext=data.簡介, #懸停顯示文本內(nèi)容
hoverinfo='text',
marker_symbol='marker',
marker_size=6)) #標(biāo)記大小
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樣式,網(wǎng)址為:
https://labs.mapbox.com/maki-icons/
但它只能呈現(xiàn)數(shù)據(jù)位置,表現(xiàn)的很單一
px.scatter_mapbox()則很好的解決這一問題,能夠?qū)arker的size和color與不同列的值相關(guān)聯(lián),通過數(shù)據(jù)點(diǎn)的位置、顏色和大小多維度地呈現(xiàn)數(shù)據(jù)(marker的symbol不可改變):
import plotly.express as px
import plotly.graph_objects as go
fig = px.scatter_mapbox(data,
lon = '經(jīng)度', #輸入經(jīng)度坐標(biāo)
lat = '緯度', #輸入緯度
color ="單價", #對應(yīng)excel的color欄,每個值代表一種顏色
hover_name ="簡介",#可以對應(yīng)excel里面的某一欄
size_max = 16, #上面size尺寸的最大值
color_continuous_scale = px.colors.carto.Temps
)
fig.update_layout(mapbox = {'accesstoken': token, #需要到官網(wǎng)注冊一個token
"center":{'lon':116.2,'lat':39.56}, #指定的地圖中心
'zoom': 7.48,
'style': 'dark', #顯示的地圖類型,有遙感地圖,街道地圖等類型
},
margin = {'l': 0, 'r': 0, 't': 0, 'b': 0})
fig.show() #顯示地圖

內(nèi)置的style可以是[basic, streets, outdoors, light, dark, satellite, satellite-streets]中的任意一種,默認(rèn)為'light'
最后,我又用爬蟲爬了北京市地鐵站點(diǎn)信息,代碼如下:
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,'經(jīng)度':lons,'緯度':lats})
dataframe
在第二張圖的基礎(chǔ)上加上地鐵線路圖:
lines=dataframe['線路'].unique().tolist()
for line in lines:
fig.add_traces(go.Scattermapbox(
mode="markers+lines",
lon=dataframe.loc[lambda x:x['線路']==line]['經(jīng)度'],
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]['經(jīng)度'],
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})

大功告成,你學(xué)會了嗎?
PS:公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!


【代碼獲取方式】
