标签: networkx

如何在python中使用networkx绘制有向图?

我有一些节点来自我想要映射到图表的脚本.在下面,我想使用箭头从A到D,并且边缘也可能有颜色(红色或其他东西).这基本上就像所有其他节点都存在时从A到D的路径.您可以将每个节点想象为城市,从A到D行进需要方向(带箭头).下面的代码构建了图表

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_edges_from(
    [('A', 'B'), ('A', 'C'), ('D', 'B'), ('E', 'C'), ('E', 'F'),
     ('B', 'H'), ('B', 'G'), ('B', 'F'), ('C', 'G')])

val_map = {'A': 1.0,
           'D': 0.5714285714285714,
           'H': 0.0}

values = [val_map.get(node, 0.25) for node in G.nodes()]

nx.draw(G, cmap = plt.get_cmap('jet'), node_color = values)
plt.show()
Run Code Online (Sandbox Code Playgroud)

但我想要一些像图中所示的东西.在此输入图像描述 在此输入图像描述

第一个图像的箭头和第二个图像的红色边缘.谢谢

python plot graph networkx

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

有没有办法保证NetworkX的分层输出?

我正在尝试生成树结构的流程图.我已经能够使用networkx创建代表图,但我需要一种方法来在输出图时显示结构.我正在使用matplotlib.pylab来绘制图形.

我需要在类似于此处所示的结构中显示数据.虽然我没有子图.

我怎样才能保证这样的结构呢?

非信徒的例子:

各种NetworkX布局

我已经能够用pylab和graphviz显示图形,但都没有提供我正在寻找的树形结构.我已经尝试过网络必须提供的每个布局,但它们都没有显示层次结构.我只是不确定提供它的选项/模式或者如果我需要使用权重.任何建议都会有所帮助.

@jterrace:

这是我用来制作上图的粗略轮廓.我添加了一些标签,但除此之外它是相同的.

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()

G.add_node("ROOT")

for i in xrange(5):
    G.add_node("Child_%i" % i)
    G.add_node("Grandchild_%i" % i)
    G.add_node("Greatgrandchild_%i" % i)

    G.add_edge("ROOT", "Child_%i" % i)
    G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
    G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)

plt.title("draw_networkx")
nx.draw_networkx(G)

plt.show()
Run Code Online (Sandbox Code Playgroud)

python networkx

71
推荐指数
2
解决办法
3万
查看次数

存储和访问节点属性python networkx

我有一个使用python创建的节点网络networkx.我想存储在节点的信息,使得我可以访问以后基于节点的标签(节点的名称),并且,其中的信息已被存储(如节点的属性)的字段中的信息.存储的信息可以是一个字符串或数字我希望这样做,以便if xyz是一个节点:

那么我想保存有像的出生日期字符串两个或三个字段xyz dob=1185,出生地点xyz pob=usa和出生的那一天xyz dayob=monday.

我知道我可以使用G.add_node其中的属性字典字段...但我似乎无法访问特定字段.如果有任何其他方式,我会很感激.

然后我想xyz与具有相同信息的网络中的其他节点进行比较.即基于日期,出生地和出生日期的节点xyz与节点abc的交集

例如,对于if节点xyzabc边缘是否打印了各自的dobs,pobs和dayobs

python attributes networkx

41
推荐指数
4
解决办法
5万
查看次数

绘制带有节点标签的networkx图,默认为节点名称

NetworkX很强大,但我试图绘制一个默认显示节点标签的图表,我很惊讶这个看起来很简单的任务对于Networkx的新手来说是多么乏味.有一个示例显示如何向绘图添加标签.

https://networkx.github.io/documentation/latest/examples/drawing/labels_and_colors.html

这个例子的问题是,当我想要做的只是在绘制图形时显示与节点名称相同的标签时,它使用了太多的步骤和方法.

# Add nodes and edges
G.add_node("Node1")
G.add_node("Node2")
G.add_edge("Node1", "Node2")
nx.draw(G)    # Doesn't draw labels. How to make it show labels Node1, Node2 along?
Run Code Online (Sandbox Code Playgroud)

有没有办法nx.draw(G)在图中内联显示默认标签(本例中为Node1,Node2)?

python networkx

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

networkx - 根据边缘属性更改颜色/宽度 - 结果不一致

我设法正确生成了图形,但是对于以下两个不同的代码行,一些更多的测试结果表明结果不一致:

nx.draw_circular(h,edge_color=[h.edge[i][j]['color'] for (i,j) in h.edges_iter()], width=[h.edge[i][j]['width'] for (i,j) in h.edges_iter()])

nx.draw_circular(h,edge_color=list(nx.get_edge_attributes(h,'color').values()), width=list(nx.get_edge_attributes(h,'width').values()))
Run Code Online (Sandbox Code Playgroud)

第一行产生一致的输出,而第二行产生每个边缘的错误颜色/大小.

但是,它看起来我上面的两行都依赖于函数调用来返回每个边缘顺序的属性.为什么结果不同?

对我来说,访问属性看起来有点笨拙 h[][][]; 是否可以通过点约定访问它,例如edge.color for edge in h.edges().

或者我错过了什么?

python networkx python-3.x

33
推荐指数
2
解决办法
3万
查看次数

如何在GraphViz中设置点格式的输出大小?

我想确保布局后所有节点都在某个范围内(比如[0,0,W,H]).

我认为边界框将是使用bb属性的解决方案,但dotneato都只是覆盖它.

例如我的图表:

strict digraph {
    1,2,3;
    1 -> 3;
    3 -> 2;
}
Run Code Online (Sandbox Code Playgroud)

产量neato -Gbb="0,0,50,50" -T dot file.txt:

strict digraph {
        graph [bb="0,0,120.49,162.36"];
        node [label="\N"];
        1        [height=0.5,
                pos="27,18",
                width=0.75];
        3        [height=0.5,
                pos="70.233,75.918",
                width=0.75];
        1 -> 3   [pos="e,57.954,59.469 39.043,34.133 43.004,39.441 47.504,45.468 51.827,51.261"];
        2        [height=0.5,
                pos="93.485,144.36",
                width=0.75];
        3 -> 2   [pos="e,87.436,126.56 76.221,93.545 78.643,100.67 81.496,109.07 84.177,116.97"];
}
Run Code Online (Sandbox Code Playgroud)

我得到的任何值相同的位置bb或者任意组合sizedpi.

我需要的是在给定的框中包含所有节点.

有什么建议怎么做?

全文:

我正在使用来自networkx的*graphviz_layout*来布局我的图表.我用pyprocessing绘制图形.我想避免重新缩放*graphviz_layout*的结果,如果有办法告诉neato我的界限.

graphviz networkx pygraphviz pyprocessing

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

改进Python NetworkX图形布局

我在使用python-networkx创建的图形可视化方面存在一些问题,我希望能够减少混乱并调节节点之间的距离(我还尝试过spring_layout,它只是以椭圆形方式布置节点).请指教. 在此输入图像描述

部分代码:

nx.draw_networkx_edges(G, pos, edgelist=predges, edge_color='red', arrows=True)
nx.draw_networkx_edges(G, pos, edgelist=black_edges, arrows=False, style='dashed')
# label fonts
nx.draw_networkx_labels(G,pos,font_size=7,font_family='sans-serif')
nx.draw_networkx_edge_labels(G,pos,q_list,label_pos=0.3)
Run Code Online (Sandbox Code Playgroud)

python networkx

31
推荐指数
3
解决办法
3万
查看次数

根据节点值为networkx中的节点绘制不同的颜色

我有一个大的节点和有向边的图.此外,我还为每个节点分配了一个额外的值列表.

我现在想根据节点值更改每个节点的颜色.例如,绘制具有非常高的红色值的节点和具有低值蓝色的节点(类似于热图).这在某种程度上很容易实现吗?如果没有使用networkx,我也可以使用Python中的其他库.

python visualization graph networkx

30
推荐指数
2
解决办法
3万
查看次数

使用python和networkx进行大图形可视化

我在python和networkx中遇到大图形可视化问题.图形希望可视化是有向的,并且边缘和顶点集大小为215,000.从文档(在首页链接)可以清楚地看出,networkx支持使用matplotlib和GraphViz进行绘图.在matplotlib和networkx中,绘图完成如下:

import 
networkx as nx
import matplotlib.pyplot as plt
#Let g be a graph that I created
nx.draw(g)
Run Code Online (Sandbox Code Playgroud)

之后我会收到一个内存错误nx.draw(g),之后您通常会执行plt.show()或尝试[some_function]以高效等格式保存文件.

接下来我尝试了GraphViz.从维基百科页面,dot格式用于有向图,我创建了一个点文件:

nx.write_dot(g, "g.dot")
Run Code Online (Sandbox Code Playgroud)

这很好用,我在当前目录中有一个12兆字节的点文件.接下来我运行dot程序(graphviz的一部分来创建postscript文件):

dot -Tps g.dot -o g.ps
Run Code Online (Sandbox Code Playgroud)

这会减慢我的电脑速度,运行几分钟然后显示Killed在终端中.因此它永远无法执行......在阅读graphviz的文档时,似乎只有无向图才能支持大图形可视化.

问题:有了这两个不成功的尝试,任何人都可以告诉我如何使用python和networkx可视化我的大图,大约215,000个顶点和215,000个边缘?我怀疑与Graphviz一样,我必须输出一个中间格式(虽然这不应该那么难,它不会像内置函数那么容易)然后使用另一个工具来读取中间格式然后输出一个可视化.

所以,我正在寻找以下内容:

  1. 从networkx输出图形为中间格式
  2. 使用新的软件包/软件/工具(理想情况下是python-interactive)读取中间格式并可视化大图

如果您需要更多信息,请告诉我们!

python visualization data-visualization networkx

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

如何将两列数组转换为具有出现次数的矩阵?

我有以下 numpy 数组:

import numpy as np

pair_array = np.array([(205, 254), (205, 382), (254, 382), (18, 69), (205, 382), 
                       (31, 183), (31, 267), (31, 382), (183, 267), (183, 382)])

print(pair_array)

#[[205 254]
# [205 382]
# [254 382]
# [ 18  69]
# [205 382]
# [ 31 183]
# [ 31 267]
# [ 31 382]
# [183 267]
# [183 382]]
Run Code Online (Sandbox Code Playgroud)

有没有办法将此数组转换为包含所有可能组合的出现次数的对称熊猫数据框?我期待这样的事情:

#     18  31  69 183 205 254 267 382 
#  18  0   0   1   0   0 …
Run Code Online (Sandbox Code Playgroud)

python numpy networkx adjacency-matrix pandas

30
推荐指数
2
解决办法
994
查看次数