如何填充或重新极化datashader热图中的稀疏数据空白(欠采样)?

2024-09-27 00:15:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在datashader中绘制一组数据时,如果X轴具有离散数字和欠采样,则会在可以看到背景的柱之间留下间隙

我一直试图通过设置一个更大的点大小或使用dynspread传递函数来解决这个问题。不走运——很可能是因为我不知道正确的应用方法

下面是我的意思的示例代码:

import pandas as pd
import numpy as np

import datashader as ds, colorcet
import holoviews as hv
from holoviews.operation.datashader import datashade
from holoviews import opts

# generate random dataset 0 - 10000
image = np.random.randn(250, 1024, 1024) + 10000
z, x, y = image.shape
print("z, x, y =", z, x, y)
    
# rearrange data to 'z' + 'value' array and convert to dataframe
arr = np.column_stack((np.repeat(np.arange(z),y*x), image.ravel()))
df = pd.DataFrame(arr, columns = ['X', 'Y'])

### Plot using in datashader
map = ds.Canvas(plot_width=800, plot_height=800)
agg = map.points(df, 'X', 'Y' )
pts = ds.tf.shade(agg, cmap=colorcet.fire)
ds.tf.set_background(pts, 'white')

当然,使用bokeh绘制同一集合也显示了同样的情况。更糟糕的是,如果放大:

hv.extension("bokeh")
datashade(hv.Points(df), cmap=colorcet.fire).relabel('Value heatmap').opts(height=700, width=800)

Tags: fromimageimportdfasnpds绘制
1条回答
网友
1楼 · 发布于 2024-09-27 00:15:01

Datashader在本例中按设计工作。将点渲染到光栅栅格中时,它会显示实际可用的点数据,直到像素栅格可以显示的极限。如果一个像素中有多个数据点,则会聚合它们的计数或值。如果某些像素中没有数据,则不显示数据

听起来你想要一种不同于数据阴影像素热图的绘图。也许:

  • 如果您的数据表示来自基础光栅或四边形网格的常规样本,请使用datashadedhv.Imagehv.Quadmesh绘图(或直接调用canvas.raster或canvas.quadmesh),而不是hv.Points或canvas.Points绘图
  • 如果您的数据表示来自基础连续分布的任意位置的样本,则可以在计算Delaunay或其他类型的三角剖分后使用datashadedhv.TriMesh或canvas.trimesh绘图填充点之间,以定义曲面
  • 如果您的数据表示来自非连续分布的任意位置的样本,但您仍希望使用连续函数对其进行近似,则可以使用(非数据阴影)hv.Bivariate图,该图计算平滑的内核密度估计值,该估计值可以有效地“连接点”,如您所述,但也可以平滑局部密度差异

这些选项都不能完全满足您的要求,但我认为TriMesh的表现将与您的建议最为相似,而对于缩小的案例,其表现仍然类似

相关问题 更多 >

    热门问题