软件版本
熊猫:1.3.3,数据着色器:0.13.0,散景:2.3.3,holoviews:1.14.6
我想达到什么/我目前的问题
我用散景/全息图绘制了一些分类数据的散点图。有时集合很大,所以我想使用数据着色器。但在许多情况下,我的数据太稀疏,看起来不太好(在这种情况下为 1672 点)。所以我必须传播它。但它看起来不太好:( 没有传播数据,只有大约 9 个像素可见;我没有展示这个图片。)
对于这种小尺寸,也可以使用没有数据着色器的全息视图。那里的图片看起来好多了:
遵循 Datashader 中的想法:我尝试使用而不是在-function 中使用的 GeoDataFrames 的分类颜色映射。aggregator=ds.by(cat_color, ds.any())
aggregator=ds.by(cat_color)
datashade
结果很奇怪: 当你不传播结果时,你会得到同样奇怪的橄榄色背景颜色,但更透明。有趣的是,这种背景颜色并不总是相同的。
可重现的代码示例
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
哪个效果更好。是否有一个原因?
有什么我想念的吗?