两轴均排序的Holoviews热图

问题描述

我有以下代码使用熊猫和holoviews生成热图:

map <leader>d <Plug>NERDCommenterToggle

"silently rejects remap will not work
nnoremap <leader>d <Plug>NERDCommenterToggle 

它产生以下内容:

enter image description here

请注意,x轴(“源”)的顺序不正确。我尝试使用“ sort()”,但它似乎只能对一个轴或另一个轴进行排序。如何使两个轴针对全息视图热图正确排序?

最佳工作-

到目前为止,我可以通过以下操作来解决它:

cols = ['source','sink','net','avg']
data = [['13002','13002',5.0,2.161478e+06],['13002','13003',6.959788e+04],'23002',4.233500e+03],'33006',8.104000e+03],'43002',9.374625e+05],'43004',2.865538e+03],'53001',1.737890e+05],'53008',3.693100e+04],'53017',4.541660e+05],'unk',23.0,1.205498e+05],['13003',2.275744e+05],3.250252e+05],'43003',4.248433e+04],'43008',7.541023e+04],'53012',5.000000e+02],5.247462e+03],['13005',2.355648e+05],['23002',1.317475e+05],1.000000e+04],4.716667e+03]]

df = pd.DataFrame(data,columns=cols)

hm = hv.HeatMap(data,kdims = ['source','sink'],vdims =['net','avg']).sort(['sink','source'])
layout = hv.Layout([hm])
layout.opts(
    opts.HeatMap(xticks=None,tools=['hover'],xrotation=90)
)

解决方法

要实现这种类型的独立排序,您需要手动指定顺序。您可以通过定义尺寸来预先执行此操作,也可以在创建绘图时重新设置设置值。

预先定义Dimension

# np.unique sorts the unique values by default
source = hv.Dimension("source",values=np.unique(df["source"]))
sink = hv.Dimension("sink",values=np.unique(df["sink"]))

(hv.HeatMap(df,kdims = [source,sink],vdims =['net','avg'])
 .opts(xticks=None,tools=['hover'],xrotation=90)
)

之后使用redim.values设置“尺寸”值

(hv.HeatMap(data,kdims = ["source","sink"],xrotation=90)
 .redim.values(
     sink=np.unique(df["sink"]),source=np.unique(df["source"]))
)

在任何一种情况下,您最终都会看到如下图: enter image description here

,

更合适的解决方案是使用@Riddell 的解决方案,但用于重新维度使用:

.redim.values(x=temp['x'].sort_values(),y=temp['y'].sort_values())
,

为了完成,我强烈建议使用 hooks 来修改散景的 Figure x_range 参数。

cols = ['source','sink','net','avg']
data = [['13002','13002',5.0,2.161478e+06],['13002','13003',6.959788e+04],'23002',4.233500e+03],'33006',8.104000e+03],'43002',9.374625e+05],'43004',2.865538e+03],'53001',1.737890e+05],'53008',3.693100e+04],'53017',4.541660e+05],'unk',23.0,1.205498e+05],['13003',2.275744e+05],3.250252e+05],'43003',4.248433e+04],'43008',7.541023e+04],'53012',5.000000e+02],5.247462e+03],['13005',2.355648e+05],['23002',1.317475e+05],1.000000e+04],4.716667e+03]]

df = pd.DataFrame(data,columns=cols)

def hook(plot,element):
    plot.handles['x_range'].factors = sorted(df['source'].unique())
hm = hv.HeatMap(data,kdims = ['source','sink'],'avg']).opts(hooks=[hook])
layout = hv.Layout([hm])

layout.opts(
    hv.opts.HeatMap(xticks=None,xrotation=90)
)

根据您的数据大小,修改散景 x_range 可能比处理 Pandas 操作快得多。而且代码更清晰一点,只添加了两行。

缺点是如果您想使用其他渲染器,如 matplotlib。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...