0

如何绘制具有不同大小的顶点和边的图形?我正在使用 ipython 和 holoviews 库。

例如,

边缘输入

start,ends
1,4
2,4
3,5
3,6
2,6

节点输入

x,y,index,type
0.0,1.0,1,a
0.5,1.0,2,a
1.0,1.0,3,a
0.4,0.0,4,b
0.5,0.0,5,b
0.6,0.0,6,b

主文件

import numpy as np
import pandas as pd
import holoviews as hv
import networkx as nx
from holoviews.operation.datashader import datashade, bundle_graph

hv.extension('bokeh')

%opts Nodes Graph [width=800 height=200 xaxis=None yaxis=None]
%opts Graph (node_size=8 edge_line_width=0.5)

colors = ['#000000']+hv.Cycle('Category20').values

edges_df = pd.read_csv('edges.csv')
nodes = hv.Nodes(pd.read_csv('nodes.csv')).sort()

graph = hv.Graph((edges_df, nodes))
graph = graph.redim.range(x=(-0.05, 1.05), y=(-0.05, 1.05)).opts(style=dict(cmap=colors))

bundled = bundle_graph(graph)
bundled

输出

在此处输入图像描述

我试图修改这一行:

node_size=[3,4,5,8,3,8]
edge_size=[0.5,0.6,0.8,1.5,0.5]
%opts Graph (node_size=node_size edge_line_width=edge_size)

但是,这是行不通的。

谁能帮我?如何创建不同大小的节点和边?

4

2 回答 2

2

目前节点大小和边缘线宽度的缩放没有直接公开(尽管很快就会公开),但是你可以直接修改数据源和字形来做这种事情。这是一个定义所谓的示例finalize_hook,它将修改数据源和字形,让您定义两者的自定义缩放:

node_size=[3,4,5,8,3,8]
edge_size=[0.5,0.6,0.8,1.5,0.5]

def scale_sizes(plot, element):
    plot.handles['scatter_1_source'].data['node_size'] = node_size
    plot.handles['scatter_1_glyph'].size = 'node_size'

    plot.handles['multi_line_1_source'].data['edge_size'] = edge_size
    plot.handles['multi_line_1_glyph'].line_width = 'edge_size'

%opts Graph [finalize_hooks=[scale_sizes]]
于 2017-12-18T12:18:24.647 回答
1

我用输入文件中的一个新列解决了节点大小问题。

x,y,index,type,size
0.0,1.0,1,a,8
0.5,1.0,2,a,10
1.0,1.0,3,a,20
0.4,0.0,4,b,8
0.5,0.0,5,b,3
0.6,0.0,6,b,15

之后,我在图表的选项中设置了列名

%opts Graph (node_size='size' edge_line_width=0.5)

但是,此策略不适用于边缘大小。

在此处输入图像描述

于 2017-12-16T15:37:25.877 回答