0

我正在使用下面的代码来获取带有下拉选择框、直方图和地图的面板仪表板。

import pandas as pd
import holoviews as hv
from holoviews.operation.datashader import datashade, rasterize, shade
import panel as pn
from holoviews.element.tiles import OSM
import hvplot.pandas

    
df = pd.read_parquet('cleanedFiles/AllMNO.parquet')
mno = pn.widgets.Select(options=df['mnc'].unique().tolist())

@pn.depends(mno)
def mnoStats(operator):
    return'### Operator {} has {} samples'.format(operator, len(df[df['mnc'] == operator]))

@pn.depends(mno)
def plotMap(mno):
    opts = dict(width=700, height=300, tools=['hover'])
    tiles = OSM().opts(alpha=0.4, xaxis=None, yaxis=None)
    points = hv.Points(df[df['mnc'] == mno], ['latitude', 'longitude'])
    rasterized = shade(rasterize(points, x_sampling=1, y_sampling=1)).opts(**opts)
    return tiles*rasterized


def plotHist(df):
    return df.hvplot.hist(y='rsrp', by='mnc', bins=20)

pn.Row(pn.Column(pn.WidgetBox('## Ofcom scanner data', mno, mnoStats)),
       pn.Column(plotHist(df))).servable()
pn.Row(plotMap).servable()

下拉选择器和直方图按预期显示,但是我得到了如下地图的“块状”图像。我想获得测量的位置(纬度/经度),每个颜色/数据由列“rsrp”表示的信号电平着色

面板仪表板

请告知如何纠正这种情况。

4

1 回答 1

1

根据 holoviews 文档,hv.rasterize它是一个高级重采样接口,并将参数传递给几个内部方法:

holoviews.core.operation.Operationgroup, input_ranges

holoviews.operation.datashader.LinkableOperationlink_inputs

holoviews.operation.datashader.ResamplingOperationdynamic, streams, expand, height, width, x_range, y_range, x_sampling, y_sampling, target, element_type, precompute

holoviews.operation.datashader.AggregationOperationvdim_prefix

基于此,看起来您的参数 x_sampling 和 y_sampling 被传递给ResamplingOperation,描述如下:

x_sampling = param.Number(allow_None=True, inclusive_bounds=(True, True), label=’X sampling’)
指定沿 x 轴的最小允许采样间隔。

y_sampling = param.Number(allow_None=True, inclusive_bounds=(True, True), label=’Y sampling’)
指定沿 y 轴的最小允许采样间隔。

所以,我猜这个问题是提供参数具有将所有数据聚合x_sampling=1, y_sampling=1rasterize1 度或大约 110 公里/70 英里块的效果,这会导致你的图形出现块状。只要您的数据本身具有足够的分辨率,将这些参数更改为较小的值(例如 0.1 或更小)即可解决问题。

于 2022-01-23T02:42:05.033 回答