Adding a label to the edge of the graph in the opnegl nodal field

I am trying to add a label to each edge in my Graph, below:

enter image description here

Basically higher with labels for each edge in the center:

enter image description here

I tried adding a label when I add an edge to each graph, for example (for graph g ):

 g.add_edge(... label=edge.distance ...) 

After some research, I found that such marking is possible under Nodebox 1, which works only for Mac , there seems to be no suitable alternative for Nodebox-OpenGL from the documentation. The error I get is:

 Traceback (most recent call last): File "C:\foo\bar\baz\Imager.py", line 29, in <module> g.add_edge(edge.fr, edge.to, length=edge.distance, weight=2, stroke=color(1.0, 0.2, 0.0), label="cheese") File "C:\Python27\lib\site-packages\nodebox\graphics\physics.py", line 1254, in add_edge e2 = e2(n1, n2, *args, **kwargs) TypeError: __init__() got an unexpected keyword argument 'label' 

You can reproduce the problem:

 from nodebox.graphics import * from nodebox.graphics.physics import Node, Edge, Graph # Create a graph with randomly connected nodes. # Nodes and edges can be styled with fill, stroke, strokewidth parameters. # Each node displays its id as a text label, stored as a Text object in Node.text. # To hide the node label, set the text parameter to None. g = Graph() # Random nodes. for i in range(50): g.add_node(id=str(i+1), radius = 5, stroke = color(0), text = color(0)) # Random edges. for i in range(75): node1 = choice(g.nodes) node2 = choice(g.nodes) g.add_edge(node1, node2, length = 1.0, weight = random(), stroke = color(0), label = "Placeholder") #!!!!!!!!!!!!! ADDING THE label HERE # Two handy tricks to prettify the layout: # 1) Nodes with a higher weight (ie incoming traffic) appear bigger. for node in g.nodes: node.radius = node.radius + node.radius*node.weight # 2) Nodes with only one connection ("leaf" nodes) have a shorter connection. for node in g.nodes: if len(node.edges) == 1: node.edges[0].length *= 0.1 g.prune(depth=0) # Remove orphaned nodes with no connections. g.distance = 10 # Overall spacing between nodes. g.layout.force = 0.01 # Strength of the attractive & repulsive force. g.layout.repulsion = 15 # Repulsion radius. dragged = None def draw(canvas): canvas.clear() background(1) translate(250, 250) # With directed=True, edges have an arrowhead indicating the direction of the connection. # With weighted=True, Node.centrality is indicated by a shadow under high-traffic nodes. # With weighted=0.0-1.0, indicates nodes whose centrality > the given threshold. # This requires some extra calculations. g.draw(weighted=0.5, directed=True) g.update(iterations=10) # Make it interactive! # When the mouse is pressed, remember on which node. # Drag this node around when the mouse is moved. dx = canvas.mouse.x - 250 # Undo translate(). dy = canvas.mouse.y - 250 global dragged if canvas.mouse.pressed and not dragged: dragged = g.node_at(dx, dy) if not canvas.mouse.pressed: dragged = None if dragged: dragged.x = dx dragged.y = dy canvas.size = 500, 500 canvas.run(draw) 

So the question remains, how can I add a label to the edge of the graph in Nodebox-OpenGL?

+4
python nodebox
Nov 22 '13 at 5:41
source share
1 answer

As you can see in the source , there is no label argument for add_edge . (search for class Edge(object):

The best way I see is to create my own MyEdge class, derived from the official Edge class, which adds the text ( label ) using

 txt = Text(str, x=0, y=0, width=None, height=None) 

or

 textpath(string, x=0, y=0, fontname=None, fontsize=None, fontweight=None) 

in the draw () method.

EDIT Note the add_edge docstring methods:

 def add_edge(self, id1, id2, *args, **kwargs): """ Appends a new Edge to the graph. An optional base parameter can be used to pass a subclass of Edge: Graph.add_edge("cold", "winter", base=IsPropertyOf) """ 
+1
Nov 22 '13 at 7:42
source share



All Articles