如何解决图树形图不创建根节点 完整代码:
我正在尝试显示以字符串为节点的可绘树图。我在根节点上添加根节点,以遵循列表“ l”内的序列,并以“ david”作为根节点。但是,该图显示根节点还有别的东西。任何帮助将不胜感激。
代码生成图形:
import igraph
from igraph import Graph,EdgeSeq
nr_vertices = 25
import plotly.offline as pyo
pyo.init_notebook_mode()
l=[('david','john'),('david','jenni'),('john','david'),'mavri'),'claire'),]
vertices = set()
for line in l:
vertices.update(line)
vertices = sorted(vertices)
print(len(l))
v_label = list(map(str,range(len(vertices))))
v2 = list(map(str,vertices))
#g = Graph.TupleList(directed=True,edges = l)
G=Graph()
#G.add_vertices(l)
G.add_vertices(vertices)
# add edges to the graph
G.add_edges(l)
lay = G.layout_reingold_tilford(mode="in",root=0)
print(G)
position = {k: lay[k] for k in range(len(vertices))}
print(position)
Y = [lay[k][1] for k in range(len(vertices))]
M = max(Y)
es = EdgeSeq(G) # sequence of edges
E = [e.tuple for e in G.es] # list of edges
print(E)
L = len(position)
Xn = [position[k][0] for k in range(L)]
Yn = [2*M-position[k][1] for k in range(L)]
Xe = []
Ye = []
for edge in E:
Xe+=[position[edge[0]][0],position[edge[1]][0],None]
Ye+=[2*M-position[edge[0]][1],2*M-position[edge[1]][1],None]
labels = v2
print(Xe)
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(x=Xe,y=Ye,mode='lines',line=dict(color='rgb(210,210,210)',width=1),hoverinfo='none'
))
fig.add_trace(go.Scatter(x=Xn,y=Yn,mode='markers',name='bla',marker=dict(symbol='circle-dot',size=30,color='#6175c1',#'#DB4551',line=dict(color='rgb(50,50,50)',width=1)
),text=labels,hoverinfo='text',opacity=0.8
))
def make_annotations(pos,text,font_size=10,font_color='rgb(250,250,250)'):
L=len(pos)
if len(text)!=L:
raise ValueError('The lists pos and text must have the same len')
annotations = []
for k in range(L):
annotations.append(
dict(
text=labels[k],# or replace labels with a different list for the text within the circle
x=pos[k][0],y=2*M-position[k][1],xref='x1',yref='y1',font=dict(color=font_color,size=font_size),showarrow=False)
)
return annotations
axis = dict(showline=False,# hide axis line,grid,ticklabels and title
zeroline=False,showgrid=False,showticklabels=False,)
fig.update_layout(title= 'Tree with Reingold-Tilford Layout',annotations=make_annotations(position,v_label),font_size=12,showlegend=False,xaxis=axis,yaxis=axis,margin=dict(l=40,r=40,b=85,t=100),hovermode='closest',plot_bgcolor='rgb(248,248,248)'
)
fig.show()
树输出:
谢谢
解决方法
我不是igraph
专家,所以我的建议可能有一些缺陷,但是它使您可以通过简单地更改以下行来将'david'
设置为根节点:
lay = G.layout_reingold_tilford(mode="in",root=0)
收件人:
lay = G.layout_reingold_tilford(mode="in",root=1)
这似乎是因为G
是使用以下构造的:
G=Graph()
#G.add_vertices(l)
G.add_vertices(vertices)
# add edges to the graph
G.add_edges(l)
顶点是:
['claire','david','jenni','john','mavri']
并且0
中的lay = G.layout_reingold_tilford(mode="in",root=0)
将'claire'
设置为根节点。因此事实证明,您可以通过指定相应的索引将root设置为['claire','mavri']
中的任何元素。因此lay = G.layout_reingold_tilford(mode="in",root=1)
产生下面的图。然后,您可以通过将1
更改为其他内容来验证我的发现。
完整代码:
import igraph
from igraph import Graph,EdgeSeq
nr_vertices = 25
import plotly.offline as pyo
pyo.init_notebook_mode()
l=[('david','john'),('david','jenni'),('john','david'),'mavri'),'claire'),]
vertices = set()
for line in l:
vertices.update(line)
vertices = sorted(vertices)
print(len(l))
v_label = list(map(str,range(len(vertices))))
v2 = list(map(str,vertices))
#g = Graph.TupleList(directed=True,edges = l)
G=Graph()
#G.add_vertices(l)
G.add_vertices(vertices)
# add edges to the graph
G.add_edges(l)
lay = G.layout_reingold_tilford(mode="in",root=1)
print(G)
position = {k: lay[k] for k in range(len(vertices))}
print(position)
Y = [lay[k][1] for k in range(len(vertices))]
M = max(Y)
es = EdgeSeq(G) # sequence of edges
E = [e.tuple for e in G.es] # list of edges
print(E)
L = len(position)
Xn = [position[k][0] for k in range(L)]
Yn = [2*M-position[k][1] for k in range(L)]
Xe = []
Ye = []
for edge in E:
Xe+=[position[edge[0]][0],position[edge[1]][0],None]
Ye+=[2*M-position[edge[0]][1],2*M-position[edge[1]][1],None]
labels = v2
print(Xe)
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(x=Xe,y=Ye,mode='lines',line=dict(color='rgb(210,210,210)',width=1),hoverinfo='none'
))
fig.add_trace(go.Scatter(x=Xn,y=Yn,mode='markers',name='bla',marker=dict(symbol='circle-dot',size=30,color='#6175c1',#'#DB4551',line=dict(color='rgb(50,50,50)',width=1)
),text=labels,hoverinfo='text',opacity=0.8
))
def make_annotations(pos,text,font_size=10,font_color='rgb(250,250,250)'):
L=len(pos)
if len(text)!=L:
raise ValueError('The lists pos and text must have the same len')
annotations = []
for k in range(L):
annotations.append(
dict(
text=labels[k],# or replace labels with a different list for the text within the circle
x=pos[k][0],y=2*M-position[k][1],xref='x1',yref='y1',font=dict(color=font_color,size=font_size),showarrow=False)
)
return annotations
axis = dict(showline=False,# hide axis line,grid,ticklabels and title
zeroline=False,showgrid=False,showticklabels=False,)
fig.update_layout(title= 'Tree with Reingold-Tilford Layout',annotations=make_annotations(position,v_label),font_size=12,showlegend=False,xaxis=axis,yaxis=axis,margin=dict(l=40,r=40,b=85,t=100),hovermode='closest',plot_bgcolor='rgb(248,248,248)'
)
fig.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。