在hv.Layout或面板的Row,Column,Gridspec

问题描述

摘要版本: 我有2个通过全息视图streams.Selection1DDynamicMap链接的节律。分别绘制时,它们可以设置不同的缩放级别(第二个图是第一个图的放大版本)。但是,当我在“布局”中并排绘制它们时,无法在每个图上设置独立的缩放级别。 如何生成其中包含的两个地图处于不同缩放级别但它们仍然共享其轴的布局?

根据进一步的调查,此问题似乎适用于holoviews布局和面板的行,列和Gridspec。本质上,当我使用其中一种机制来展示我的两个绘图时,在绘图级别设置的任何选项都会被Layout,Row等覆盖。

完整版本: 我有2个节律:

1。英国地图。多边形是地方政府区域。图钉是商店位置。

# LHS UK MAP: 3 components - the map,the store pins and the map tile
uk_map = gv.polygons(all_lads,vdims=["store_lad_name","store_sales_count","store_lad_sales_rank"]
           ).opts(padding=(0,0.2),color="store_lad_sales_rank",cmap = "Reds_r",colorbar=True,hover_line_color="black",hover_alpha=0.2,line_width = 1,show_legend=True,legend_position="top",clabel="Sales League",width=850,height=1000
                 )

uk_store_pins = gv.Points(all_uk_stores[["store_long","store_lat","store_name","store_sales_league","avg_cust_dist_trav_miles","store_postcode","store_lad_name"]],label = "All UK Store Locations").opts(tools=["hover","tap"],color="purple",size = 10,line_color="black",hover_color="orange",hover_line_color="white",line_width=2,muted_fill_alpha=0) 
uk_store_pins

lhs_map = uk_map * uk_store_pins * gvts.OSM
lhs_map 

enter image description here

当您单击特定的商店位置图钉时,它应该会生成此地图的其他放大版本:

2。商店特定的放大地图:

# ZOOMED IN PLOT HAS THE FOLLOWING COMPONENTS - the zoomed in map,the pin,the radius and the map tile
def produce_zoomed_in_maps(index):
    
    # DRAW THE ZOOMED IN MAP,BASED ON THE map_selection
    zoom_map = gv.polygons(map_selection,vdims=["LAD20NM"]
               ).opts(tools=["hover",padding=(0,toolbar="below",cmap = "Blues",hover_line_color="red",height=1000
                     )
    
    # SPECIFIC PIN FOR THE STORE THAT THIS ZOOMED IN MAP RELATES TO - THIS IS A SOURCE OF MAP DATA ON HOVER
    selected_store = store.index
    store_pin = gv.Points(all_uk_stores.iloc[selected_store][["store_long",label = "Store Location").opts(tools=["hover",size = 15,legend_position="top"
                                               ) 
    
    map_result_pre = zoom_map * store_pin * gvts.OSM
    return map_result_pre
# CALculaTE radius
# THIS IS ADAPTED FROM: https://gis.stackexchange.com/questions/289044/creating-buffer-circle-x-kilometers-from-point-using-python

proj_wgs84 = pyproj.Proj('+proj=longlat +datum=wgs84')

def geodesic_point_buffer(index):
    lat = all_uk_stores.iloc[index]["store_lat"]
    lon = all_uk_stores.iloc[index]["store_long"]
    km = all_uk_stores.iloc[index]["avg_cust_dist_trav_km"]
    # Azimuthal equidistant projection
    aeqd_proj = '+proj=aeqd +lat_0={lat} +lon_0={lon} +x_0=0 +y_0=0'
    project = partial(
        pyproj.transform,pyproj.Proj(aeqd_proj.format(lat=lat,lon=lon)),proj_wgs84)
    buf = Point(0,0).buffer(km * 1000)  # distance in metres
    cust_radius_coords = transform(project,buf).exterior.coords[:]
    # THIS WILL RETURN THE SET OF POINTS (LONG&LAT) THAT TOGETHER MAKE UP THE RADIUS AROUND EACH STORE
    radius = gv.Points(cust_radius_coords)
    return radius
# PRODUCE THE COMBINED PLOT:
def map_it_FINAL(index):
    return produce_zoomed_in_maps(index[0]) * geodesic_point_buffer(index[0])

enter image description here

当我分别绘制2个色度时,它们具有所需的缩放级别。

但是,如果我将两个地块链接在一起并使用布局并排显示两个地图(左侧是完整的英国地图,右侧是放大的商店特定地图),那么右侧的放大地块则不会。 t实际上会放大。相反,它与完整的英国地图保持在相同的缩放级别(很抱歉,在这里我不得不将地块显示在另一个上方,而不是从左到右):

# LINK TOGETHER LHS AND RHS PLOT
selection = streams.Selection1D(source=uk_store_pins,index=[0])

# CREATE A DYNAMIC MAP,Feed IN YOUR FUNCTION NAME AND THE VARIABLE SET FOR THE SELECTION STREAM IE "selection"
rhs_related_zoomed_map = hv.DynamicMap(map_it_FINAL,streams=[selection])
# PRODUCE YOUR SIDE BY SIDE PLOTS
lhs_map + rhs_related_zoomed_map

enter image description here

enter image description here

我尝试按照此处所述手动设置右侧地图的缩放比例:https://github.com/holoviz/geoviews/issues/340

def set_zoom_level(index):
    store = all_uk_stores.iloc[index[0]]
    store_catchment_lads = store["catchment_lads"].tolist()
    map_selection = lad20_shpfile.loc[lad20_shpfile["LAD20NM"].isin(store_catchment_lads)]
    minx,miny,maxx,maxy = map_selection["geometry"].total_bounds
    return minx,maxy

minx,maxy = set_zoom_level(selection.index)
lhs_map + rhs_related_zoomed_map.redim.range(Longitude=(minx,maxx),Latitude=(miny,maxy))

这成功地将我的右侧地图的缩放比例设置到了所需的水平,但是不幸的是,它也放大了整个英国地图的比例。

enter image description here

enter image description here

我还尝试设置两个图的缩放级别(使用左侧图的UK的total_bounds),但这产生的结果与未设置任何一个图的缩放级别相同。

我还尝试在版式上设置shared_axes=False。这具有为我的左和右十字轴分别设置两个缩放级别的理想结果。但是,由于不再连接轴,因此在单击UK地图时,确实会在右侧生成正确的放大地图,而在每个引脚选择上,右侧地图都不会移动到新位置。您必须手动平移到新位置。

如何生成全息视图布局或面板的行,列或网格规格,其中包含的两个地图处于不同的缩放级别,但它们仍共享其轴?

谢谢

解决方法

好问题!据我所知,用于轴共享的唯一预构建选项是完全打开或完全关闭,因此您必须自己制作。也许有更好的方法,但是在这种情况下,我要做的是遵循http://holoviews.org/user_guide/Custom_Interactivity.html在第一张地图上连接Tap源,以在另一张地图上设置范围。我没有尝试过,但是似乎可行...