import warnings
warnings.filterwarnings('ignore')
import os
import numpy as np
from scipy.stats import norm
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import cartopy.crs as ccrs
import geopandas as gpd
import cartopy.io.shapereader as shpreader
from shapely.geometry import Polygon
from matplotlib.patches import Polygon as mpl_polygon
西安滴滴打车数据
import folium
# 数据点不要太多
df_gao = pd.read_csv('data/出租车订单数据一周_split_1.csv') .head(1000)
folium与bokeh结合
import folium
from folium.plugins import HeatMap
from bokeh.embed import components
from bokeh.layouts import column
from bokeh.models import Div
from bokeh.io import output_notebook, show
output_notebook()
Loading BokehJS ...
# 创建Folium地图对象
m = folium.Map([34.34, 108.94],
tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
attr='高德-常规图',
zoom_start=10)
# 假设坐标点数据存储在一个名为locations的列表中
locations = []
for index, row in df_gao.iterrows():
locations.append([row['on_lat'], row['on_lon']])
# 使用HeatMap插件生成热力图
heat_map = HeatMap(locations)
# 将热力图添加到地图上
heat_map.add_to(m)
# 将Folium地图转换为HTML字符串
html_map = m.get_root().render()
# 创建一个Bokeh的Div组件,并将Folium地图的HTML字符串作为内容
div = Div(text=html_map, width=800, height=600)
# 创建Bokeh布局,将Folium地图的Div组件添加到布局中
layout = column(div)
# 在Jupyter Notebook中显示布局
show(layout)
Make this Notebook Trusted to load map: File -> Trust Notebook
from bokeh.embed import components
from bokeh.resources import INLINE
js_resources = INLINE.render_js() # 基本图形比较简单js和css通用
css_resources = INLINE.render_css()
script,div = components(layout) # 可以在Flask路由中嵌入展示
示例
@main.route('/', methods=['GET']) @login_required def index(): return render_template('index.html',
js_resources=js_resources, css_resources=css_resources, plot_script=script, plot_div=div, )
bokeh独立实现
import math
# 经纬度转为墨卡托坐标系
def lonLat2WebMercator(lon,Lat):
x = lon *20037508.34/180;
y = math.log(math.tan((90+Lat)*math.pi/360))/(math.pi/180)
y = y *20037508.34/180;
return x,y
def lonLat2WebMercator_Lon(lon): #GPS经度
x = lon *20037508.34/180
return x
def lonLat2WebMercator_Lat(Lat): # GPS纬度
y = math.log(math.tan((90+Lat)*math.pi/360))/(math.pi/180)
y = y *20037508.34/180
return y
df_new=df_gao.copy()
df_new.head()
get_on_time | get_off_time | wait_time | money | on_lon | on_lat | month | day | |
0 | 2022/6/6 11:27 | 6/6/2022 11:48:01 | 360 | 22.1 | 108.843652 | 34.284082 | 6 | 6 |
1 | 2022/6/6 11:48 | 6/6/2022 12:03:01 | 120 | 15.1 | 108.921210 | 34.261690 | 6 | 6 |
2 | 2022/6/6 12:08 | 6/6/2022 12:20:01 | 60 | 20.1 | 108.869150 | 34.288140 | 6 | 6 |
3 | 2022/6/6 12:33 | 6/6/2022 12:49:00 | 180 | 13.9 | 108.837240 | 34.307332 | 6 | 6 |
4 | 2022/6/6 12:54 | 6/6/2022 13:01:01 | 120 | 8.5 | 108.867260 | 34.274390 | 6 | 6 |
df_new["Lon"] = df_new["on_lon"].apply(lonLat2WebMercator_Lon)
df_new["Lat"] = df_new["on_lat"].apply(lonLat2WebMercator_Lat)
from bokeh.plotting import figure, save
from bokeh.util.browser import view
from bokeh.document import Document
from bokeh.resources import INLINE
from bokeh.models import Plot
from bokeh.models import Range1d
from bokeh.models import WheelZoomTool, PanTool, BoxZoomTool
from bokeh.models import WMTSTileSource
# 设置x,y轴的经纬度范围,自动受地图高宽影响
x_range = Range1d(int(df_new["Lon"].min()),int(df_new["Lon"].max()))
y_range = Range1d(int(df_new["Lat"].min()),int(df_new["Lat"].max()))
tile_options = {}
tile_options['url'] = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}' # style=7,8
tile_options['attribution'] = """
'? <a href="https://intumu.com/">@intumu.com</a>.
""" # 地图右下角标签
tile_source = WMTSTileSource(**tile_options)
# 实例化plot
p = figure(x_range=x_range, y_range=y_range, height=800, width=1000,x_axis_type="mercator", y_axis_type="mercator")
# 标记区域
p.scatter(df_new['Lon'], df_new['Lat'],size=5, marker="circle", color="red", alpha=0.99,legend_label='乘车点')
# 渲染地图
p.add_tools(BoxZoomTool(match_aspect=True)) # WheelZoomTool(), PanTool(),
tile_renderer_options = {}
p.add_tile(tile_source, **tile_renderer_options)
# 其他参数
p.xaxis.visible = False
p.yaxis.visible = False
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
p.legend.orientation = "horizontal"
p.legend.location = "top_center"
p.legend.click_policy="hide" # 点击图例显示、隐藏图形
p.sizing_mode = 'scale_width'
# 显示
show(p)
# 将 Bokeh 图表保存为 HTML 文件
# save(p, filename="my_plot.html")
civilpy:【地理信息可视化】basemap(cartopy)+geopandas显示地图-01
civilpy:【地理信息可视化】basemap(cartopy)+geopandas显示地图-02
civilpy:【地理信息可视化】basemap(cartopy)+geopandas显示地图-03
civilpy:Python数据分析及可视化实例目录