在全息视图中,如何对叠加层的分类轴进行排序?

时间:2019-07-16 16:27:40

标签: python holoviews

我有一个熊猫数据框,其中有3个分类列(A,B,C)和1个数字(N)。我用x轴A,y轴N绘制了一个散点图,并用B进行了分层(为便于参考,只需将其设为二进制)。因此,每个A-C组合都有一个点,用B着色(2色)。这将导致一个NdLayout对象。

现在,我试图使x轴的顺序正确,其中值按该类别的值的绝对总和排序(与层无关,即B)。

如果我仅基于组和对数据框中的A条目进行排序,则它适用于大多数情况。但是,在一种情况下,对于B的特定层没有A-C条目,即缺少数据。例如,如果B = 1,则对于该层不存在A值,但对于B = 0则存在A值。因此,在绘制此图形时,会将值添加到错误的位置,因为我正在使用NdLayout。

是否有一个后期绘图过程来更改维度中的因子顺序?

import holoviews as hv
hv.extension("matplotlib")
import colorcet as cc

ds = hv.Dataset(data,kdims=["A"],vdims=["N","B"])
scatter = ds.to(hv.Scatter,"A","N","B").overlay().opts(opts.Scatter(color=hv.Cycle([cc.isolum[0]] + [cc.isolum[-1]]),xrotation=90))

示例:

A = ['Sample_{}'.format(ii) for ii in range(20)]
C = ['Category_{}'.format(ii) for ii in range(10)]
b_data = np.asarray([np.random.normal(0,xx+1,size=10) for xx in range(20)])

B_1 = pd.DataFrame(b_data,index=A,columns=C)
B_1 = B_1.rename_axis('A').reset_index().melt(id_vars='A',value_name='N',var_name='C')
B_1['B'] = 1

#create data set with one of the Sample_ entries removed.
b_data = np.asarray([np.random.normal(0,xx+1,size=10) for xx in range(19)])
B_0 = pd.DataFrame(b_data,index=A[:-1],columns=C)
B_0 = B_0.rename_axis('A').reset_index().melt(id_vars='A',value_name='N',var_name='C')
B_0['B'] = 0

myData = pd.concat([B_1,B_0])

featureOrder = myData.groupby('A')['N'].apply(lambda x: x.abs().sum()).sort_values(ascending=False).index
myData['A'] = pd.Categorical(myData.A, categories=featureOrder,ordered=True)
myData =myData.sort_values(by='A')

#generate plot using hvplot
myData.hvplot.scatter(x='A',y='N',by='B').opts(padding=0.1,xrotation=90)

#the following gives the same output, but doesn't use hvplot
ds = hv.Dataset(myData,kdims=["A"],vdims=["N","B"])
scatter = ds.to(hv.Scatter,"A","N","B").overlay().opts(opts.Scatter(color=hv.Cycle([cc.isolum[0]] + [cc.isolum[-1]]),xrotation=90))
print(featureOrder)
Index(['Sample_17', 'Sample_18', 'Sample_13', 'Sample_16', 'Sample_11',
       'Sample_15', 'Sample_14', 'Sample_10', 'Sample_19', 'Sample_12',
       'Sample_9', 'Sample_6', 'Sample_8', 'Sample_7', 'Sample_5', 'Sample_4',
       'Sample_3', 'Sample_2', 'Sample_1', 'Sample_0'],
      dtype='object', name='A')

enter image description here

从图中将Sample_19添加到末尾,而它应该是9。如果我改变B的值,则该图的顺序正确。

1 个答案:

答案 0 :(得分:0)

根据上面的示例,如果将scatter[1] * scatter[0]scatter[0] * scatter[1]进行比较,您会发现它是Overlay中定义分类轴顺序的第一个元素,其余元素仅附加(如您所知)。

目前一种解决方法是为您希望成为订购内容的所有丢失数据插入NaN。

(有关分类轴分类的更通用方法,这是最近几个问题的内容,希望有一天会实现-请参阅我的评论中链接的github问题。)