harishB97 commited on
Commit
b4194f8
·
verified ·
1 Parent(s): c28d9bf

Update app3.py

Browse files
Files changed (1) hide show
  1. app3.py +77 -181
app3.py CHANGED
@@ -27,7 +27,10 @@ for species, imgpath in species_to_imgpath.items():
27
 
28
 
29
  class Node():
 
30
  def __init__(self, name):
 
 
31
  self.name = name
32
  self.parent = None
33
  self.children = [] # list of type Node
@@ -37,6 +40,7 @@ class Node():
37
 
38
 
39
  name_to_node = {}
 
40
 
41
  def get_root(node):
42
  root = node
@@ -59,7 +63,7 @@ def get_tree(imgpath):
59
  node = name_to_node[node_name]
60
  else:
61
  node = Node(node_name)
62
- name_to_node[node_name] = node
63
 
64
  child_nodes = []
65
  for child_name in child_names:
@@ -67,7 +71,7 @@ def get_tree(imgpath):
67
  child_node = name_to_node[child_name]
68
  else:
69
  child_node = Node(child_name)
70
- name_to_node[child_name] = child_node
71
  child_node.parent = node
72
  child_nodes.append(child_node)
73
 
@@ -77,206 +81,98 @@ def get_tree(imgpath):
77
  return get_root(node)
78
 
79
 
80
- # def display_tree():
81
- # # This function should create and return a Plotly figure of the tree
82
-
83
- # # Define the nodes and edges for the graph
84
- # nodes = ['Node 1', 'Node 2', 'Node 3', 'Node 4']
85
- # edges = [(0, 1), (0, 2), (2, 3)] # Edges are tuples of node indices
86
-
87
- # # Define positions for the nodes (you can use a layout algorithm for more complex graphs)
88
- # positions = [(0, 0), (1, 2), (1, -2), (2, 0)]
89
-
90
- # # Create traces for nodes and edges
91
- # edge_x = []
92
- # edge_y = []
93
- # for edge in edges:
94
- # x0, y0 = positions[edge[0]]
95
- # x1, y1 = positions[edge[1]]
96
- # edge_x.extend([x0, x1, None])
97
- # edge_y.extend([y0, y1, None])
98
-
99
- # edge_trace = go.Scatter(
100
- # x=edge_x, y=edge_y,
101
- # line=dict(width=2, color='Black'),
102
- # hoverinfo='none',
103
- # mode='lines')
104
-
105
- # node_x = [pos[0] for pos in positions]
106
- # node_y = [pos[1] for pos in positions]
107
-
108
- # node_trace = go.Scatter(
109
- # x=node_x, y=node_y,
110
- # mode='markers+text',
111
- # hoverinfo='text',
112
- # marker=dict(showscale=False, size=10, color='Goldenrod'),
113
- # text=nodes,
114
- # textposition="top center"
115
- # )
116
-
117
- # # Define the layout of the graph
118
- # layout = go.Layout(
119
- # showlegend=False,
120
- # hovermode='closest',
121
- # margin=dict(b=0, l=0, r=0, t=0),
122
- # xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
123
- # yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)
124
- # )
125
-
126
- # # Create the figure
127
- # fig = go.Figure(data=[edge_trace, node_trace], layout=layout)
128
- # return fig
129
 
130
  ROOT = None
131
 
132
 
133
- # def display_tree():
134
- # nodes = []
135
- # edges = []
136
- # positions = {}
 
 
 
 
 
137
 
138
- # root = ROOT
139
-
140
- # def traverse(node, depth=0, index=0):
141
-
142
- # if depth >= 3:
143
- # return
144
-
145
- # if node not in nodes:
146
- # nodes.append(node)
147
- # idx = nodes.index(node)
148
- # positions[idx] = (depth * 1, index * 1 - len(nodes) / 2) # Adjusted the multipliers for depth and index
149
-
150
- # for child in node.children:
151
- # if child not in nodes:
152
- # nodes.append(child)
153
- # child_idx = nodes.index(child)
154
- # edges.append((idx, child_idx))
155
- # traverse(child, depth + 1, index + len(node.children) / 2) # Recursively traverse to set positions
156
-
157
- # traverse(root)
158
-
159
- # edge_x = []
160
- # edge_y = []
161
- # for edge in edges:
162
- # x0, y0 = positions[edge[0]]
163
- # x1, y1 = positions[edge[1]]
164
- # edge_x.extend([x0, x1, None])
165
- # edge_y.extend([y0, y1, None])
166
-
167
- # edge_trace = go.Scatter(
168
- # x=edge_x, y=edge_y,
169
- # line=dict(width=2, color='Black'),
170
- # hoverinfo='none',
171
- # mode='lines')
172
-
173
- # node_x = [pos[0] for pos in positions.values()]
174
- # node_y = [pos[1] for pos in positions.values()]
175
-
176
- # node_trace = go.Scatter(
177
- # x=node_x, y=node_y,
178
- # mode='markers+text',
179
- # hoverinfo='text',
180
- # marker=dict(showscale=False, size=10, color='Goldenrod'),
181
- # text=[node.name for node in nodes],
182
- # textposition="top center"
183
- # )
184
-
185
- # layout = go.Layout(
186
- # title="Tree Visualization",
187
- # showlegend=False,
188
- # hovermode='closest',
189
- # margin=dict(b=0, l=0, r=0, t=40),
190
- # xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
191
- # yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)
192
- # )
193
-
194
- # fig = go.Figure(data=[edge_trace, node_trace], layout=layout)
195
- # return fig
196
 
197
-
198
-
199
-
200
-
201
- def create_edge_list(node, edge_list=None, name_map=None):
202
- if edge_list is None:
203
- edge_list = []
204
- if name_map is None:
205
- name_map = {}
206
-
207
- if node.name not in name_map:
208
- name_map[node.name] = len(name_map)
209
-
210
- for child in node.children:
211
- if child.name not in name_map:
212
- name_map[child.name] = len(name_map)
213
- edge_list.append((name_map[node.name], name_map[child.name]))
214
- create_edge_list(child, edge_list, name_map)
215
-
216
- return edge_list, list(name_map.keys())
217
-
218
- def display_tree():
219
  root = ROOT
220
- edge_list, node_names = create_edge_list(root)
221
-
222
- # Create an igraph Graph from edge list
223
- g = ig.Graph(edges=edge_list, directed=True)
224
-
225
- # Use the Reingold-Tilford tree layout
226
- layout = g.layout('rt', root=[0])
227
-
228
- # Scale the layout to make the tree more compact
229
- scale_factor = 0.2 # Adjust this factor as needed
230
- layout_coords = [(coord[0] * scale_factor, coord[1] * scale_factor) for coord in layout.coords]
231
-
232
- x_coords = [coord[0] for coord in layout_coords]
233
- y_coords = [-coord[1] for coord in layout_coords] # invert y-axis for a top-down tree view
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
 
235
- # Create Plotly traces for nodes and edges
236
  edge_trace = go.Scatter(
237
- x=[None],
238
- y=[None],
239
- line=dict(width=2, color='#888'),
240
  hoverinfo='none',
241
- mode='lines'
242
- )
243
-
244
- for v1, v2 in g.get_edgelist():
245
- x0, y0 = layout_coords[v1]
246
- x1, y1 = layout_coords[v2]
247
- # edge_trace['x'] += [x0, x1, None]
248
- # edge_trace['y'] += [-y0, -y1, None] # invert y-axis
249
 
250
- edge_trace['x'] += tuple(list(edge_trace['x']) + [x0, x1, None])
251
- edge_trace['y'] += tuple(list(edge_trace['y']) + [-y0, -y1, None]) # invert y-axis
 
252
 
253
  node_trace = go.Scatter(
254
- x=x_coords, y=y_coords,
255
- text=node_names,
256
- mode='markers+text',
257
- hoverinfo='text',
258
- textposition='top center',
259
- marker=dict(
260
- showscale=False,
261
- color='Blue',
262
- size=10,
263
- line_width=2),
264
- textfont=dict(
265
- size=12, # Increase the font size as needed
266
- color='Black'
267
- )
268
- )
269
 
270
  # Create a Plotly figure
271
  fig = go.Figure(data=[edge_trace, node_trace],
272
  layout=go.Layout(
 
 
273
  showlegend=False,
274
  hovermode='closest',
275
- margin=dict(b=0, l=0, r=0, t=0),
276
  xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
277
  yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
278
- title="Tree Visualization"
 
 
 
 
 
279
  ))
 
280
  return fig
281
 
282
 
@@ -298,7 +194,7 @@ with gr.Blocks() as demo:
298
  print(ROOT.name)
299
  gr.Markdown("## Interactive Tree and Image Display")
300
  with gr.Row():
301
- tree_output = gr.Plot(display_tree) # Connect the function directly
302
 
303
  with gr.Row():
304
  with gr.Column():
 
27
 
28
 
29
  class Node():
30
+ id = 0
31
  def __init__(self, name):
32
+ self.id = Node.id
33
+ Node.id += 1
34
  self.name = name
35
  self.parent = None
36
  self.children = [] # list of type Node
 
40
 
41
 
42
  name_to_node = {}
43
+ id_to_node = {}
44
 
45
  def get_root(node):
46
  root = node
 
63
  node = name_to_node[node_name]
64
  else:
65
  node = Node(node_name)
66
+ name_to_node[node_name] = id_to_node[node_name] = node
67
 
68
  child_nodes = []
69
  for child_name in child_names:
 
71
  child_node = name_to_node[child_name]
72
  else:
73
  child_node = Node(child_name)
74
+ name_to_node[child_name] = id_to_node[node_name] = child_node
75
  child_node.parent = node
76
  child_nodes.append(child_node)
77
 
 
81
  return get_root(node)
82
 
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
 
85
  ROOT = None
86
 
87
 
88
+ def create_binary_tree_edges(root):
89
+ edges = []
90
+ prev = [root]
91
+ while len(prev) == 0:
92
+ new_prev = []
93
+ for node in prev:
94
+ edges += [(node.id, child.id) for child in node.children]
95
+ new_prev += [child for child in node.children if (len(child.children) > 0)]
96
+ prev = new_prev
97
 
98
+ def plot_tree_using_igraph():
99
+ # Define the edges in a tree structure
100
+ # edges = [(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), (2, 6)]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  root = ROOT
103
+ edges = create_binary_tree_edges(root)
104
+ # edges = [(str(n1), str(n2)) for (n1, n2) in edges]
105
+
106
+ print(edges)
107
+
108
+ # Create an igraph Graph from the edge list
109
+ g = ig.Graph(edges, directed=True)
110
+
111
+ # Validate the root index
112
+ if g.vcount() > 0: # Check if the graph has any vertices
113
+ root_vertex_id = 0 # This assumes that vertex '0' is the root
114
+ else:
115
+ print("The graph has no vertices.")
116
+ return None
117
+
118
+ # Use the Reingold-Tilford layout to position the nodes
119
+ try:
120
+ layout = g.layout_reingold_tilford(root=None) # Correct root specification
121
+ except Exception as e:
122
+ print(f"Error computing layout: {e}")
123
+ return None
124
+
125
+ # Edge traces
126
+ edge_x = []
127
+ edge_y = []
128
+ for edge in edges:
129
+ start_idx, end_idx = edge
130
+ x0, y0 = layout.coords[start_idx]
131
+ x1, y1 = layout.coords[end_idx]
132
+ edge_x.extend([x0, x1, None])
133
+ edge_y.extend([-y0, -y1, None]) # y values are inverted to make the tree top-down
134
 
 
135
  edge_trace = go.Scatter(
136
+ x=edge_x, y=edge_y,
137
+ line=dict(width=0.5, color='#888'),
 
138
  hoverinfo='none',
139
+ mode='lines')
 
 
 
 
 
 
 
140
 
141
+ # Node traces
142
+ node_x = [pos[0] for pos in layout.coords]
143
+ node_y = [-pos[1] for pos in layout.coords] # y values are inverted
144
 
145
  node_trace = go.Scatter(
146
+ x=node_x, y=node_y,
147
+ text=["Node {}".format(i) for i in range(len(layout.coords))],
148
+ mode='markers+text',
149
+ hoverinfo='text',
150
+ marker=dict(
151
+ showscale=False,
152
+ size=10,
153
+ color='LightSkyBlue'
154
+ ),
155
+ textposition="bottom center"
156
+ )
 
 
 
 
157
 
158
  # Create a Plotly figure
159
  fig = go.Figure(data=[edge_trace, node_trace],
160
  layout=go.Layout(
161
+ title='<b>Tree Layout with iGraph and Plotly</b>',
162
+ titlefont_size=16,
163
  showlegend=False,
164
  hovermode='closest',
165
+ margin=dict(b=0, l=0, r=0, t=50),
166
  xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
167
  yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
168
+ # height=600,
169
+ # width=600,
170
+ annotations=[dict(
171
+ showarrow=False,
172
+ xref="paper", yref="paper",
173
+ x=0.005, y=-0.002 )]
174
  ))
175
+
176
  return fig
177
 
178
 
 
194
  print(ROOT.name)
195
  gr.Markdown("## Interactive Tree and Image Display")
196
  with gr.Row():
197
+ tree_output = gr.Plot(plot_tree_using_igraph) # Connect the function directly
198
 
199
  with gr.Row():
200
  with gr.Column():