我有一个熊猫数据框,其中有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')
从图中将Sample_19添加到末尾,而它应该是9。如果我改变B的值,则该图的顺序正确。
答案 0 :(得分:0)
根据上面的示例,如果将scatter[1] * scatter[0]
与scatter[0] * scatter[1]
进行比较,您会发现它是Overlay中定义分类轴顺序的第一个元素,其余元素仅附加(如您所知)。
目前一种解决方法是为您希望成为订购内容的所有丢失数据插入NaN。
(有关分类轴分类的更通用方法,这是最近几个问题的内容,希望有一天会实现-请参阅我的评论中链接的github问题。)