标签: networkx

在Networkx中更改节点显示大小

我没有使用GraphViz,因为我在使用Networkx时遇到问题.我知道这很奇怪,但是我已经尝试了很多建议来解决这个问题,但我似乎只有一些世界上最糟糕的运气.因此,我必须在不使用GraphViz的情况下使用Networkx解决问题.

我的程序读取文档,并尝试根据文档的内容绘制MindMap的内容.但是,在实际绘制节点时,Networkx似乎具有默认大小.这对我不好,因为很多文本都会进入我的每个节点.我需要一种方法来增加节点的显示大小(任意地,根据属于该节点的文本的大小).

我曾尝试查看Networkx网站,关于SO的其他问题以及来自Google的大约200个搜索结果,没有运气.

python networkx

12
推荐指数
1
解决办法
1万
查看次数

如何只保留networkx-graph中的节点有2个以上的输出边或0个输出边?

我在networkx中有Directed Graph.我想只保留那些具有两个或两个以上的传出边或根本没有传出边的节点.我该怎么做呢?

要么

如何删除networkx图中只有一个传出边的节点.

python networkx

12
推荐指数
1
解决办法
7588
查看次数

从DataFrame到NetworkX加载具有属性和边的节点

我是使用Python处理图形的新手:NetworkX.到现在为止我使用过Gephi.标准步骤(但不是唯一可行的)是:

  1. 从表/电子表格加载节点信息; 其中一列应该是ID,其余的是关于节点的元数据(节点是人,因此性别,组...通常用于着色).喜欢:

    id;NormalizedName;Gender
    per1;Jesús;male
    per2;Abraham;male
    per3;Isaac;male
    per4;Jacob;male
    per5;Judá;male
    per6;Tamar;female
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后从表/电子表格加载边缘,使用与节点电子表格的列ID中的节点相同的名称,通常有四列(目标,来源,重量和类型):

    Target;Source;Weight;Type
    per1;per2;3;Undirected
    per3;per4;2;Undirected
    ...
    
    Run Code Online (Sandbox Code Playgroud)

这是我拥有的两个数据帧,我想用Python加载它们.阅读关于NetworkX,似乎不太可能将两个表(一个用于节点,一个用于边缘)加载到同一个图表中,我不确定最好的方法是什么:

  1. 我应该仅使用DataFrame中的节点信息创建图形,然后添加(追加)来自其他DataFrame的边缘吗?如果是这样,并且因为nx.from_pandas_dataframe()需要有关边的信息,我想我不应该用它来创建节点......我应该只是将信息作为列表传递?

  2. 我是否应该仅使用DataFrame中的边信息创建图形,然后将来自其他DataFrame的信息作为属性添加到每个节点?有没有比迭代DataFrame和节点更好的方法呢?

python graph networkx pandas

12
推荐指数
3
解决办法
9797
查看次数

比较大量的同构图

我正在比较同构的一大组networkx图,其中大多数图不应该是同构的(例如,假设0-20%与列表中的某些东西是同构的).

我尝试了以下方法.

graphs = [] # A list of networkx graphs
unique = [] # A list of unique graphs

for new in graphs:
    for old in unique:
        if nx.is_isomorphic(new, old[0]):
            break
    else:
        unique.append([new])
Run Code Online (Sandbox Code Playgroud)

这让我得到了一个更快的缩小集,但我仍然发现它太慢而不适合理想使用.是否有一些更快的算法来处理这类问题(比较传递交换属性对)或将此算法扩展到多核设置(在20核机器上运行)的方法.

我已经过滤这些集合基于节点/边的数量数据,我们可以假设nx.is_isomorphic功能不能进行任何过滤类型的操作速度更快.我现在也无法轻松更改工具,因此使用编译包不是一种选择.

附加信息:

图形倾向于大约16-20个节点,总共24-48个边缘,存在大量互连,因此每个节点具有大约8个边缘.每个边缘也都有标记,但是只使用了2-3种边缘.

python data-mining networkx

12
推荐指数
2
解决办法
1010
查看次数

将节点标签添加到散景网络图中

我使用以下代码生成交互式散景网络图.如何将节点名称添加到散景图中的节点?

from bokeh.io import show, output_notebook
from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, TapTool, BoxSelectTool
from bokeh.models.graphs import from_networkx, NodesAndLinkedEdges, EdgesAndLinkedNodes
from bokeh.palettes import Spectral4
from bokeh.models import LabelSet

plot = Plot(plot_width=900, plot_height=500,
            x_range=Range1d(-1.1,1.1), y_range=Range1d(-1.1,1.1))
plot.title.text = "Graph Interaction Demonstration"

plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())

graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))

graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])
graph_renderer.node_renderer.selection_glyph = Circle(size=15, fill_color=Spectral4[2])
graph_renderer.node_renderer.hover_glyph = Circle(size=15, fill_color=Spectral4[1])
graph_renderer.node_renderer.glyph.properties_with_values()
graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=5)
graph_renderer.edge_renderer.selection_glyph = MultiLine(line_color=Spectral4[2], line_width=5)
graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color=Spectral4[1], line_width=5)

graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy …
Run Code Online (Sandbox Code Playgroud)

python networkx bokeh

12
推荐指数
3
解决办法
3919
查看次数

Networkx 2.1+ 中修改单节点属性的简单方法

我正在寻找一种简单的方法来修改 NetworkX 图表内单个节点的单个属性的值。

NetworkX 文档仅提到了为图中所有节点设置属性的函数,例如:

nx.set_node_attributes(G, bb, 'betweenness')
Run Code Online (Sandbox Code Playgroud)

这在许多情况下可能是合适的,在这些情况下,这样的属性很容易为图中的所有节点计算(例如提到的介数)。同样,有一种简单的方法可以访问 NetworkX 中的单节点属性:

graph.nodes[nodeName][attribute]
Run Code Online (Sandbox Code Playgroud)

但是,以这种方式访问​​的属性是只读的。

所以我正在寻找一种像阅读一样简单的设置属性的方法。

提前致谢。

graph networkx python-3.x

12
推荐指数
1
解决办法
7518
查看次数

在街道数据(图表)中查找社区(集团)

我正在寻找一种方法来自动将城市中的社区定义为图形上的多边形。

我对邻里的定义有两个部分:

  1. 街区:在多条街道之间封闭的区域,其中街道(边)和交叉点(节点)的数量最少为三个(三角形)。
  2. 邻域:对于任何给定的街区,与该街区直接相邻的所有街区以及街区本身。

有关示例,请参见此插图:

在此处输入图片说明

例如,B4是由 7 个节点和连接它们的 6 个边定义的块。正如此处的大多数示例一样,其他块由 4 个节点和连接它们的 4 条边定义。此外,附近B1包括B2(反之亦然),而B2还包括B3

我正在使用osmnx从 OSM 获取街道数据。

  1. 使用 osmnx 和 networkx,我如何遍历图来找到定义每个块的节点和边?
  2. 对于每个块,我如何找到相邻的块?

我正在努力编写一段代码,该代码以图形和一对坐标(纬度、经度)作为输入,识别相关块并返回该块的多边形以及上述定义的邻域。

这是用于制作地图的代码:

import osmnx as ox
import networkx as nx
import matplotlib.pyplot as plt

G = ox.graph_from_address('Nørrebrogade 20, Copenhagen Municipality',
                          network_type='all', 
                          distance=500)
Run Code Online (Sandbox Code Playgroud)

以及我试图找到具有不同节点数和度数的派系。

def plot_cliques(graph, number_of_nodes, degree):
    ug = ox.save_load.get_undirected(graph)
    cliques = nx.find_cliques(ug)
    cliques_nodes = [clq for clq in cliques if len(clq) …
Run Code Online (Sandbox Code Playgroud)

python algorithm graph-theory networkx osmnx

12
推荐指数
1
解决办法
1249
查看次数

使用networkx的节点标签

我正在根据给定的Y值序列创建一个图形curveSeq.(X值自动枚举:0,1,2 ......)

即为curveSeq = [10,20,30],我的图表将包含点:

<0,10>, <1,20>, <2,30>.
Run Code Online (Sandbox Code Playgroud)

我正在绘制一系列图表nx.Graph,以便在一张图片中呈现所有内容.

我的问题是:

  • 每个节点都显示其位置.即位置中的节点<0,10>呈现其各自的标签,我不知道如何删除它.
  • 我想要添加标签的特定节点,但我不知道如何.

例如,对于序列:

[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1]
Run Code Online (Sandbox Code Playgroud)

收到的图表是:

图形

代码是:

for point in curveSeq:
                cur_point = point
                #assert len(cur_point) == 2
                if prev_point is not None:
                    # Calculate the distance between the nodes with the Pythagorean
                    # theorem
                    b = cur_point[1] - prev_point[1]
                    c = cur_point[0] - prev_point[0]
                    a = math.sqrt(b ** 2 + c ** 2)
                    G.add_edge(cur_point, prev_point, weight=a)
                G.add_node(cur_point)
                pos[cur_point] = cur_point
                prev_point = …
Run Code Online (Sandbox Code Playgroud)

python matplotlib networkx

11
推荐指数
1
解决办法
2万
查看次数

用Python解决图形问题

我有一种情况,我想用Python来解决这个问题,但不幸的是我对图表知之甚少.我找到了一个看起来非常适合这个相对简单的任务的库networkx,但是我遇到的问题是我想做的事情,这应该是相当简单的.

我有一个节点列表,可以有不同的类型,以及两个"类"的邻居,向上和向下.任务是在两个目标节点之间找到路径,并考虑到一些约束:

  • 只能遍历特定类型的节点,即如果起始节点是x类型,则路径中的任何节点都必须来自另一组路径y或z
  • 如果节点的类型为y,则只能传递一次
  • 如果节点具有类型z,则可以传递两次
  • 如果访问类型为z的节点,则退出必须来自不同类别的邻居,即如果从上方访问,则退出必须来自向下

所以,我尝试了一些实验,但正如我所说,我一直在努力.首先,我不确定这实际代表什么类型的图表?它不是方向性的,因为从节点1到节点2,或从节点2到节点1无关紧要(除了在最后一个场景中,因此使事情复杂化......).这意味着我不能只创建一个简单的多向图形,因为我必须考虑到这个约束.其次,我必须遍历这些节点,但指定只有特定类型的节点必须可用于路径.此外,如果最后一个场景发生,我必须记住进入和退出类/方向,这使它处于某种有针对性的状态.

这是一些示例模型代码:

import networkx as nx

G=nx.DiGraph()
G.add_node(1, type=1)
G.add_node(2, type=2)
G.add_node(3, type=3)
G.add_edge(1,2, side="up")
G.add_edge(1,3, side="up")
G.add_edge(2,1, side="down")
G.add_edge(2,3, side="down")
for path in nx.all_simple_paths(G,1,3):
    print path
Run Code Online (Sandbox Code Playgroud)

输出相当不错,但我需要这些约束.那么,您是否有一些建议如何实现这些,或者给我一些关于理解这类问题的指导,或者针对这个问题提出不同的方法或库?也许一个简单的基于字典的算法适合这种需要?

谢谢!

python algorithm graph path networkx

11
推荐指数
2
解决办法
1155
查看次数

'Graph'对象在networkx模块python中没有属性'nodes_iter'

我使用networkx模块在python2.7中有以下函数,产生错误.

for H in networkx.connected_component_subgraphs(G):
    bestScore = -1.0
    for n, d in H.nodes_iter(data=True):
        if d['Score'] > bestScore:
            bestScore = d['Score']
            bestSV = n
    if bestSV is not None:
        selectedSVs.add(bestSV)
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
File "cnvClassifier.py", line 128, in <module>
for n, d in H.nodes_iter(data=True):
AttributeError: 'Graph' object has no attribute 'nodes_iter'
Run Code Online (Sandbox Code Playgroud)

有谁知道出了什么问题?

python networkx

11
推荐指数
2
解决办法
1万
查看次数