加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在nodebox opnegl中向标签的边缘添加标签

发布时间:2020-12-20 13:38:36 所属栏目:Python 来源:网络整理
导读:我想在我的图表中为每条边添加一个标签,如下所示: 基本上上面是中心每个边缘的标签: 当我为每个图添加边时,我试图添加一个标签,就像这样(对于图g): g.add_edge(... label=edge.distance ...) 经过一些研究,我发现这种标签在Nodebox 1,which only works fo
我想在我的图表中为每条边添加一个标签,如下所示:

基本上上面是中心每个边缘的标签:

当我为每个图添加边时,我试图添加一个标签,就像这样(对于图g):

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

经过一些研究,我发现这种标签在Nodebox 1,which only works for Mac下是可能的,文件中似乎没有合适的Nodebox-OpenGL替代品.我收到的错误:

Traceback (most recent call last):
  File "C:foobarbazImager.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:Python27libsite-packagesnodeboxgraphicsphysics.py",line 1254,in add_edge
    e2 = e2(n1,n2,*args,**kwargs)
TypeError: __init__() got an unexpected keyword argument 'label'

您可以重现该问题:

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(),label = "Placeholder")    #!!!!!!!!!!!!! ADDING THE label HERE

# Two handy tricks to prettify the layout:
# 1) Nodes with a higher weight (i.e. 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)

那么,问题仍然存在,如何在Nodebox-OpenGL中为图形边缘添加标签?

解决方法

正如您在 source中看到的那样,add_edge没有参数label. (搜索类Edge(对象):)

我能看到的最好的方法是创建自己的MyEdge类,该类源自官方Edge类,它使用文本(标签)添加

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

要么

textpath(string,fontname=None,fontsize=None,fontweight=None)

在draw()方法中.

编辑
注意add_edge方法docstring:

def add_edge(self,id1,id2,**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)
    """

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读