我有非常大的数据集,我无法直接使用全息视图进行绘制。我想用分类数据制作散点图。不幸的是,我的数据非常稀疏,许多点都将 NA 作为类别。我想让这些点变灰。有什么方法可以让数据着色器知道我想做什么?
我向您展示我现在的做法(正如https://holoviews.org/user_guide/Large_Data.html中或多或少提出的那样)。我给你举个例子:
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,spread
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),)
datashaded=datashade(points,aggregator=ds.by(color)).opts(width=800, height=480)
(spread(datashaded,px=4, shape='square')*color_points).opts(legend_position='right')
您可以看到一些问题:最重要的是,虽然只有一个来自巴黎的人,但您会看到 NA 人(查理)也印有紫色,这是巴黎的颜色。有没有办法让点变灰?我尝试了很多情节,似乎 NA 总是采用图例中最后一项的颜色。
然后有一些我不想提出问题的小问题。(如果您认为他们应该提出自己的问题,请告诉我,我是 stackoverflow 的新手,感谢您的建议。)
另一个问题:这些点的大小并不相同。这是相当丑陋的。有没有办法改变它?
然后我还有一个问题:datashader内部是否也使用.cat.categories
-method来决定使用什么颜色?数据着色器使用的颜色是如何确定的?因为我想知道图例是否总是按正确的顺序排列(显示正确的颜色:如果您在cats
那时排列顺序color_key
并且cats
不再按相同的顺序并且图例显示错误的颜色)。它似乎总是像我一样工作,但我觉得有点不安全。
也许有人想给出他们的意见Points
,在这种情况下是否可以用于散点图。因为我没有看到任何区别,Scatter
并且在语义上也没有真正的一个变量会导致另一个变量(尽管有人可能会争辩说在这种情况下年龄会导致经验,但我将绘制不容易找到的变量那些类型的因果关系)所以Points
如果我正确理解文档https://holoviews.org/reference/elements/bokeh/Points.html最好使用。