地理数据#
Bokeh 支持创建基于地图的可视化和处理地理数据。
瓦片提供器地图#
Bokeh 兼容多种使用 Web Mercator 投影的 XYZ 瓦片服务。Bokeh 使用 xyzservices 库来处理瓦片源及其归属信息。要将这些添加到绘图中,请使用 add_tile()
方法。您可以传递 xyzservices 可以识别的任何名称。retina
关键字可以控制瓦片的分辨率。
from bokeh.plotting import figure, show
# range bounds supplied in web mercator coordinates
p = figure(x_range=(-2000000, 2000000), y_range=(1000000, 7000000),
x_axis_type="mercator", y_axis_type="mercator")
p.add_tile("CartoDB Positron", retina=True)
show(p)
如果您传递 retina=True
,Bokeh 将尝试使用比默认设置高 2 倍分辨率的瓦片。但是,此功能需要瓦片提供商的支持。否则,该关键字将被忽略。或者,您可以将 'retina'
包含在瓦片提供器名称字符串中,例如 'CartoDB Positron retina'
,这将等同于 retina=True
。
请注意,将 x_axis_type="mercator"
和 y_axis_type="mercator"
传递给 figure
会生成带有纬度和经度标签的坐标轴,而不是原始的 Web Mercator 坐标。
或者,您可以使用任何 xyzservices.TileProvider
,无论是 xyzservices
中预定义的还是自定义的。
import xyzservices.providers as xyz
from bokeh.plotting import figure, show
# range bounds supplied in web mercator coordinates
p = figure(x_range=(-2000000, 6000000), y_range=(-1000000, 7000000),
x_axis_type="mercator", y_axis_type="mercator")
p.add_tile(xyz.OpenStreetMap.Mapnik)
show(p)
可用的内置瓦片提供器在 xyzservices 文档中列出,或者以交互方式作为 xyzservices.providers
模块列出。
下面显示了最常见瓦片提供器的代表性示例。
CartoDB Positron#
CartoDB 瓦片服务的瓦片源

Esri World Imagery#
ESRI 公共瓦片的瓦片源。

OSM#
Open Street Map Mapnik 的瓦片源。

Google 地图#
要在 Google 地图上绘制字形,请使用 gmap()
函数。要使该函数工作,您必须向其传递 Google API 密钥 并配置 Google 地图底层 GMapOptions
。Google API 密钥将存储在 Bokeh 文档 JSON 中。
from bokeh.models import ColumnDataSource, GMapOptions
from bokeh.plotting import gmap, show
map_options = GMapOptions(lat=30.2861, lng=-97.7394, map_type="roadmap", zoom=11)
# For GMaps to function, Google requires you obtain and enable an API key:
#
# https://developers.google.com/maps/documentation/javascript/get-api-key
#
# Replace the value below with your personal API key:
p = gmap("GOOGLE_API_KEY", map_options, title="Austin")
source = ColumnDataSource(
data=dict(lat=[ 30.29, 30.20, 30.29],
lon=[-97.70, -97.74, -97.78]),
)
p.scatter(x="lon", y="lat", size=15, fill_color="blue", fill_alpha=0.8, source=source)
show(p)
注意
任何将 Bokeh 与 Google 地图结合使用的情况都必须遵守 Google 的服务条款。
Google 地图始终对纵横比施加显式控制,这给 GMapPlot
带来了一些限制
仅支持
Range1d
范围。尝试使用其他范围类型将导致错误。BoxZoomTool
的使用与GMapPlot
不兼容,添加它不会有任何效果。
GeoJSON 数据#
GeoJSON 是一种流行的开放标准,用于使用 JSON 表示地理特征。它将点、线和多边形(在 Bokeh 中称为 Patches)描述为特征的集合。每个特征也可以有一组属性。
Bokeh 的 GeoJSONDataSource
几乎可以无缝地替代 Bokeh 的 ColumnDataSource
使用。例如
import json
from bokeh.models import GeoJSONDataSource
from bokeh.plotting import figure, show
from bokeh.sampledata.sample_geojson import geojson
data = json.loads(geojson)
for i in range(len(data['features'])):
data['features'][i]['properties']['Color'] = ['blue', 'red'][i%2]
geo_source = GeoJSONDataSource(geojson=json.dumps(data))
TOOLTIPS = [('Organisation', '@OrganisationName')]
p = figure(background_fill_color="lightgrey", tooltips=TOOLTIPS)
p.scatter(x='x', y='y', size=15, color='Color', alpha=0.7, source=geo_source)
show(p)
警告
Bokeh 将 GeoJSON 坐标转换为名为 x
和 y
或 xs
和 ys
的列(具体取决于特征是点、线、多线、多边形还是多多边形)。当 GeoJSON 被转换时,名称冲突的属性将被覆盖,应避免使用。