我正在尝试使用Bokeh绘制TimeSlider地图,并且使用这些工具还很新。我正在使用Jupyter笔记本。
我需要提供GeoDataFrame列名称的列表作为绘图函数的参数。问题是,当我尝试在我的GeoDataFrame中添加所需的列时,我可以添加6列,然后计算机崩溃(尝试添加第7列时RAM瞬间上升)。我试图在Google Collab中运行我的笔记本,但是当在我的GeoDataFrame中添加第7列时,会话也会崩溃。我没有从Python得到任何错误,除了重启计算机之外,我无能为力。
[当我尝试仅用6年实现Slider时,该图是正确的,但我想涵盖50年,距离我还很远。
这是我的代码:
创建GeoDataFrame
df_states = gpd.read_file("countries.geo.json") # the GeoDataFrame
frames = {i:dat for i, dat in meat_production.groupby('Year')} # getting the useful info from another dataset
years = range(1961, 2017)
for y in years:
frames[y] = frames[y].drop('Year', axis=1)
df_states = df_states.merge(frames[y], on="id")
df_states = df_states.rename(columns={'Value': 'Meat %d'%y})
for循环非常适合第一次迭代,并给出我想要的结果。
绘制地图
slider_columns = ["Meat %d"%i for i in years]
df_states.plot_bokeh(
figsize = (900,600),
simplify_shapes=10000,
slider = slider_columns,
slider_range = years,
slider_name = 'Year',
colormap = 'Inferno',
hovertool_columns = ['id']+slider_columns,
title='Meat production'
)
还有另一种方法来定义plot_bokeh的参数吗?您知道如何处理此类问题吗?
提前感谢!
plot_bokeh
函数不是实际的Bokeh库的一部分。也许它是在Bokeh之上构建的其他一些单独的第三方库的一部分?无论如何,我将假定它创建独立的输出,而不是Bokeh服务器应用程序。在这种情况下,所有数据会被预先发送到浏览器。地理数据尤其会迅速爆炸。您尚未指定有关数据大小的任何详细信息,但作为一个假设示例:
50 yrs * 100 shapes/yr * 10k pt/shape * 2 coords/pt * 8 bytes/coord ~= 800 MB
这就是开始。那是原始的[[data-space坐标。所有这些坐标都必须转换为2倍的屏幕(即像素)坐标,因此现在您需要的是1.6GB。仍然没有完成。 Bokeh致力于提供高水平的交互性,因此会将所有数据放入省时的空间索引中(以支持悬停,Taptool等)。当前尚无选择(通过一项提议的功能添加一种方法),这是另一大内存成本,可以随着数据大小快速扩展。我们甚至没有提到可能还会发送任何每形状或每顶点属性数据。简而言之,通过此示例,您可以轻松地创建约3-6GB数据在浏览器中。那只是行不通的,在此级别之前,事情将开始崩溃。 我会说有几个选择:
创建Bokeh服务器应用程序。然后,浏览器只需要保存
如果形状每年不变,那么您也可以(可能)仅发送形状的一个副本,而不是每年发送一次。至少可以肯定地用纯Bokeh代码实现。 (不确定在Bokeh上构建的库是什么)