0

软件版本

熊猫:1.3.3,数据着色器:0.13.0,散景:2.3.3,holoviews:1.14.6

我想达到什么/我目前的问题

我用散景/全息图绘制了一些分类数据的散点图。有时集合很大,所以我想使用数据着色器。但在许多情况下,我的数据太稀疏,看起来不太好(在这种情况下为 1672 点)。所以我必须传播它。但它看起来不太好:( 使用 datashader 完成绘图并使用 hd.spread 进行传播 没有传播数据,只有大约 9 个像素可见;我没有展示这个图片。)

对于这种小尺寸,也可以使用没有数据着色器的全息视图。那里的图片看起来好多了: 没有数据着色器的绘图 遵循 Datashader 中的想法:我尝试使用而不是在-function 中使用的 GeoDataFrames 的分类颜色映射aggregator=ds.by(cat_color, ds.any())aggregator=ds.by(cat_color)datashade

结果很奇怪: 使用带有 any() 作为参数的 datashader 绘图,然后展开 当你不传播结果时,你会得到同样奇怪的橄榄色背景颜色,但更透明。有趣的是,这种背景颜色并不总是相同的。

可重现的代码示例

import numpy as np
import pandas as pd
import holoviews as hv
hv.extension('bokeh')
import datashader as ds
from datashader.colors import Sets1to3
from holoviews.operation.datashader import datashade,dynspread



raw_data = [('Alice', 60, 'London', 5) ,
           ('Bob', 14, 'Delhi' , 7) ,
           ('Charlie', 66, np.NaN, 11) ,
           ('Dave', np.NaN,'Delhi' , 15) ,
           ('Eveline', 33, 'Delhi' , 4) ,
           ('Fred', 32, 'New York', np.NaN ),
           ('George', 95, 'Paris', 11)
            ]
# Create a DataFrame object
df = pd.DataFrame(raw_data, columns=['Name', 'Age', 'City', 'Experience'])
df['City']=pd.Categorical(df['City'])



x='Age'
y='Experience'
color='City'
cats=df[color].cat.categories





# Make dummy-points (currently the only way to make a legend: https://holoviews.org/user_guide/Large_Data.html)
for cat in cats:
    #Just to make clear how many points of a given category we have
    print(cat,((df[color]==cat)&(df[x].notnull())&(df[y].notnull())).sum())
color_key=[(name,color) for name, color in zip(cats,Sets1to3)]
color_points = hv.NdOverlay({n: hv.Points([0,0], label=str(n)).opts(color=c,size=0) for n,c in color_key})


# Create the plot with datashader
points=hv.Points(df, [x, y],label="%s vs %s" % (x, y),)#.redim.range(Age=(0,90), Experience=(0,14))
datashaded1=datashade(points,aggregator=ds.by(color)).opts(width=550, height=480)
datashaded2=datashade(points,aggregator=ds.by(color,ds.any())).opts(width=550, height=480)

dynspread(datashaded1)*color_points+dynspread(datashaded2)*color_points

当您删除 ds.any() 时,一切都会或多或少地工作(在https://github.com/holoviz/holoviews/issues/5070上讨论了一些小问题),但是在这样做时ds.any()根本dynspread不起作用。这个问题也存在于我的实际数据中,但我可能只会使用spread哪个效果更好。是否有一个原因?

在此处输入图像描述

有什么我想念的吗?

4

0 回答 0