gpt4 book ai didi

python - datashader xarray.Image 到 Holoviews 点

转载 作者:行者123 更新时间:2023-12-01 00:30:19 24 4
gpt4 key购买 nike

这是代码:

import datashader as ds
import pandas as pd
from colorcet import fire
from datashader import transfer_functions as tf
from datashader.utils import lnglat_to_meters
import holoviews as hv
import geoviews as gv
from holoviews.operation.datashader import datashade, spread, aggregate
hv.extension('bokeh')

df = pd.read_csv('...')

agg = ds.Canvas().points(df, 'x', 'y', agg=ds.count())
img = tf.shade(agg.where(agg['x']>0), cmap=fire)

url = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.jpg'
tile_opts = dict(width=1000,height=600,xaxis=None,yaxis=None,show_grid=False,bgcolor='black')
map_tiles = gv.WMTS(url).opts(style=dict(alpha=1.0), plot=tile_opts)
points = hv.Points(df, ['x', 'y'])
#points = img # <-- Using this does not work
ds_points = spread(datashade(points, width=1000, height=600, cmap=fire), px=2)

map_tiles * ds_points

上面的代码基于 pandas 数据帧中的数据创建了一个 Holoviews Points 对象,并使用了 spread()datashade() 函数Holoviews 在 map 上绘制点。但是,我想在将数据绘制在 map 上之前对数据进行一些转换。我尝试使用 datashader 中已有的功能,但我无法弄清楚如何将 datashader 创建的 xarray.Image 对象转换为 Holoviews Point 对象它可以绘制在 map 图 block 的顶部。

编辑

我无法在注释中正确设置代码格式,因此我将其放在这里。

我尝试执行以下作为退化案例:

from custom_operation import CustomOperation
points = hv.Points(df, ['x', 'y'])
CustomOperation(rasterize(points))

其中 CustomOperation 定义为:

from holoviews.operation import Operation

class CustomOperation(Operation):
def _process(self, element, key=None):
return element

这会产生以下错误:

AttributeError:“Image”对象没有属性“get”

最佳答案

Datashader 创建的 Image 对象是一个规则的网格/值数组,它按 bin 聚合原始点,因此不再可能恢复原始点。在这个已经是 2D 直方图的数据上使用 HoloViews Points 对象是没有意义的; Points 对象需要一组单独的点,而不是二维数组。相反,您可以使用 HoloViews Image 对象,它接受类似于 Datashader 生成的二维数组。语法类似于 hv.Image(img),但我无法使用上面的代码对其进行测试,因为如果没有 CSV 文件,它就无法运行。

请注意,如果您采用这种方法,将会发生的情况是 Datashader 会将点渲染到固定大小的网格中,然后 HoloViews 会将特定的值网格覆盖到 map 上。即使您放大或平移,您仍然会看到相同的网格;它永远不会像当前代码那样更新以更高分辨率显示数据子集,因为在开始使用 HoloViews 或 Bokeh 绘制任何内容之前,Datashader 计算将全部完成并为您提供一个固定数组。如果您想要动态缩放和更新,请不要单独使用 Datashader API(Canvas.pointstf.shade 等) ;您需要使用已经使用的 HoloViews 操作(datashadespreadrasterize 等)或定义自定义 HoloViews操作来封装您想要执行的处理(如果需要,可以包括手动调用 Datashader API),并允许在用户每次平移或缩放时动态应用处理。

关于python - datashader xarray.Image 到 Holoviews 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58239651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com