最初に、英国ポストコードエリアのインタラクティブマップを作成しました。ここで、個々のエリアはその値(たとえば、ポストコードエリア内の人口)に基づいて表されます。bokeh - データシェイダーを使用してシェイプファイルマップをプロットする
from bokeh.plotting import figure
from bokeh.palettes import Viridis256 as palette
from bokeh.models import LinearColorMapper
from bokeh.models import ColumnDataSource
import geopandas as gpd
shp = 'file_path_to_the_downloaded_shapefile'
#read shape file into dataframe using geopandas
df = gpd.read_file(shp)
def expandMultiPolygons(row, geometry):
if row[geometry].type = 'MultiPolygon':
row[geometry] = [p for p in row[geometry]]
return row
#Some rows were in MultiPolygons instead of Polygons.
#Expand MultiPolygons to multi rows of Polygons
df = df.apply(expandMultiPolygons, geometry='geometry', axis=1)
df = df.set_index('Area')['geometry'].apply(pd.Series).stack().reset_index()
#Visualize the polygons. To visualize different colors for different post areas, I added another column called 'value' which has some random integer value.
p = figure()
color_mapper = LinearColorMapper(palette=palette)
source = ColumnDataSource(df)
p.patches('x', 'y', source=source,\
fill_color={'field': 'value', 'transform': color_mapper},\
fill_alpha=1.0, line_color="black", line_width=0.05)
ここで、dfは、ポストコード領域、x座標、y座標、値(すなわち母集団)の4つの列のデータフレームです。
上記のコードは、Webブラウザにインタラクティブマップを作成しますが、インタラクティブ性が非常に滑らかではないことに気付きました。地図を拡大または移動すると、ゆっくりとレンダリングされます。データフレームのサイズは1106行しかないので、なぜそれが遅いのかはかなり混乱しています。
私はdatashader(https://datashader.readthedocs.io/en/latest/)に遭遇しましたが、サンプルスクリプトはかなり複雑で、ほとんどがJupyterノートブックのholoviewパッケージですが、bokehを使用してダッシュボードを作成したいと考えています。
上記のbokehスクリプトにdatashaderを組み込むことについて助言してくれる人はいませんか? bokehのパッチ関数を使用するのではなく、シェイプマップを作成するためにdatashader内で別の関数が必要ですか?
どのような提案も高く評価されます。
データフレームのサイズが私には問題ないようです。どのようにしてパッチを作成しましたか?シェイプファイルやジオジソンを使用していますか?非常に複雑なポリゴンをプロットすると速度が低下する可能性があると私は考えています。あなたはあなたのポリゴンを単純化することができます。 – mc51
http://www.opendoorlogistics.com/downloads/のシェイプファイル形式で英国のポストコード境界ポリゴンを使用しました。英国のポストコードエリアポリゴンは複雑すぎますか?私は視覚化の目的のために領域を使用する必要がありますし、おそらく低解像度英国の郵便番号形状ファイルがありますか? – user4279562