- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Graphvize 绘制下图:
xx = nx.DiGraph()
xx.add_node("P")
xx.add_node("C0")
xx.add_node("C1")
xx.add_node("I2")
xx.add_node("C3")
xx.add_node("C4")
xx.add_node("I5")
xx.add_node("C6")
xx.add_node("C7")
xx.node["C1"]['pos'] = (2,3)
xx.node["I2"]['pos'] = (4,5)
xx.node["C3"]['pos'] = (6,7)
xx.node["C4"]['pos'] = (6,5)
xx.node["I5"]['pos'] = (4,1)
xx.node["C6"]['pos'] = (6,2)
xx.node["C7"]['pos'] = (6,0)
xx.node["P"]['pos'] = (-2,3)
xx.node["C0"]['pos'] = (0,3)
xx.add_edge("P", "C0")
xx.add_edge("C0", "C1")
xx.add_edge("C1", "I2")
xx.add_edge("I2", "C3")
xx.add_edge("I2", "C4")
xx.add_edge("C1", "I5")
xx.add_edge("I5", "C6")
xx.add_edge("I5", "C7")
layout = dict((n, xx.node[n]["pos"]) for n in xx.nodes_iter())
nx.draw(xx,pos=layout,node_color='white')
nx.write_dot(xx,'66666.dot')
使用 matplotlitb 我得到所有节点的正确位置:
使用 Graphviz 没有位置的图形。
我的问题:是否有可能在 Graphviz 中添加正确的位置?是否可以直接在 python 中打开文件“66666.dot”?
非常感谢您的帮助!
最佳答案
由于NetworkX库来不及更新和打破向后兼容性,问题中描述的问题仍然存在于新版本的库中,我将尝试更新NetworkX 2.8.7变体的示例代码并提供一个解决方案。
NameError:未定义名称“nx”
pip install networkx
)并在代码开头包含该库: import networkx as nx
AttributeError:“有向图”对象没有属性“节点”
xx.nodes["C1"]['pos']
而不是 xx.node["C1"]['pos']
。引用:NetworkX Migration guide from 1.X to 2.0 AttributeError:“DiGraph”对象没有属性“nodes_iter”
xx.nodes()
而不是 xx.nodes_iter()
。 Reference .AttributeError:模块 networkx 没有属性 write_dot
nx.drawing.nx_agraph.write_dot(xx,'66666.dot')
而不是 nx.write_dot(xx,'66666.dot')
。引用:AttributeError: 'module' object has no attribute 'write_dot' for networkx library Note: If you do not already have graphviz and
pygraphviz
installed, you may need to install it.pygraphviz
library for Windows can be installed as a precompiled binary downloaded from Unofficial Windows Binaries for Python Extension Packages with commandpip install nameOfDownloadedPackage.whl
.
示例代码现在如下所示:
# Listing 1
import networkx as nx
xx = nx.DiGraph()
xx.add_node("P")
xx.add_node("C0")
xx.add_node("C1")
xx.add_node("I2")
xx.add_node("C3")
xx.add_node("C4")
xx.add_node("I5")
xx.add_node("C6")
xx.add_node("C7")
xx.nodes["C1"]['pos'] = (2,3)
xx.nodes["I2"]['pos'] = (4,5)
xx.nodes["C3"]['pos'] = (6,7)
xx.nodes["C4"]['pos'] = (6,5)
xx.nodes["I5"]['pos'] = (4,1)
xx.nodes["C6"]['pos'] = (6,2)
xx.nodes["C7"]['pos'] = (6,0)
xx.nodes["P"]['pos'] = (-2,3)
xx.nodes["C0"]['pos'] = (0,3)
xx.add_edge("P", "C0")
xx.add_edge("C0", "C1")
xx.add_edge("C1", "I2")
xx.add_edge("I2", "C3")
xx.add_edge("I2", "C4")
xx.add_edge("C1", "I5")
xx.add_edge("I5", "C6")
xx.add_edge("I5", "C7")
layout = dict((n, xx.nodes[n]["pos"]) for n in xx.nodes())
nx.draw(xx,pos=layout,node_color='white')
nx.drawing.nx_agraph.write_dot(xx,'66666.dot')
TLDR:使用格式 pos="x,y!"
记录文件中节点的位置,而不是 pos=("x,y")
。
现在我们有了一个可行的示例,我们可以继续讨论如何绘制节点的正确位置。
创建的文件 66666.dot
包含 dot
language 中的文本:
strict digraph "" {
P [pos="(-2, 3)"];
C0 [pos="(0, 3)"];
P -> C0;
C1 [pos="(2, 3)"];
C0 -> C1;
I2 [pos="(4, 5)"];
C1 -> I2;
I5 [pos="(4, 1)"];
C1 -> I5;
C3 [pos="(6, 7)"];
I2 -> C3;
C4 [pos="(6, 5)"];
I2 -> C4;
C6 [pos="(6, 2)"];
I5 -> C6;
C7 [pos="(6, 0)"];
I5 -> C7;
}
如果你有graphviz安装后,您可以在终端中运行命令:
dot -Tpng 66666.dot -o output.png
并检查将在文件 output.png
中绘制的内容:
问题是在 graphviz 库中有不同的 layout engines , 负责绘制节点的位置和 dot
layout engine不理解属性 pos="(4, 1)"
, 所以我们将使用 neato
layout engine了解此属性(如其文档中所述)。我们在终端中得到输出:
Error: node P, position (-2, 3), expected two doubles
Error: node C0, position (0, 3), expected two doubles
Error: node C1, position (2, 3), expected two doubles
Error: node I2, position (4, 5), expected two doubles
Error: node I5, position (4, 1), expected two doubles
Error: node C3, position (6, 7), expected two doubles
Error: node C4, position (6, 5), expected two doubles
Error: node C6, position (6, 2), expected two doubles
Error: node C7, position (6, 0), expected two doubles
和文件output.png
:
我们看到坐标不影响绘图位置,并且写入有关输入数据格式不正确的错误。如此处所述(converting network graph to graphviz),此错误是由于坐标值输入不正确造成的。 graphviz 理解的格式是 pos="x,y"
,而不是 pos="(x,y)"
。
Note: Full value format looks like this
%f,%f('!')?
(e.g.pos="42,24!"
). The optional!
indicates the node position should not change.
让我们在将图形对象写入文件之前更改其位置格式:
# Listing 2
# See the previous part of the code in Listing 1
for node in xx:
xx.nodes[node]['pos'] = "{},{}!".format(
xx.nodes[node]['pos'][0], xx.nodes[node]['pos'][1])
nx.drawing.nx_agraph.write_dot(xx,'66666.dot')
现在文件 66666.dot
中的结果:
strict digraph "" {
P [pos="-2,3!"];
C0 [pos="0,3!"];
P -> C0;
C1 [pos="2,3!"];
C0 -> C1;
I2 [pos="4,5!"];
C1 -> I2;
I5 [pos="4,1!"];
C1 -> I5;
C3 [pos="6,7!"];
I2 -> C3;
C4 [pos="6,5!"];
I2 -> C4;
C6 [pos="6,2!"];
I5 -> C6;
C7 [pos="6,0!"];
I5 -> C7;
}
output.png
中的结果:
看起来挺好的。为了使其看起来像 matplotlib 的结果,您需要添加更多属性 label
, shape
到节点和arrowhead
到边缘:
# Listing 3
# See the previous part of the code in Listing 1
for node in xx:
xx.nodes[node]['pos'] = "{},{}!".format(
xx.nodes[node]['pos'][0], xx.nodes[node]['pos'][1])
xx.nodes[node]['label'] = ""
xx.nodes[node]['shape'] = "circle"
for edge in xx.edges:
xx.edges[edge]['arrowhead'] = 'box'
nx.drawing.nx_agraph.write_dot(xx,'66666.dot')
output.png
中的结果:
Note (optional): To show the result of the matplotlib, add at the beginning of the file
import matplotlib.pyplot as plt
and at the endplt.show()
.
.dot
文件filename.dot
并获取图形对象,可以使用函数 networkx.drawing.nx_agraph.read_dot
.关于Python Networkx graphviz : Plot right position of nodes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35730535/
我正在尝试对网络上的投票动态进行建模,并希望能够在 NetworkX 中创建一个图表,在其中我可以在节点上迭代投票过程,让它们的颜色变化对应于它们的投票“标签”。 我已设法获得此代码以查看每个节点的属
我无法计算简单 NetworkX 加权图的中心性。 这是正常的还是我做错了什么? 我使用简单的 add_edge(c[0],c[1],weight = my_values) 添加边,其中c[0],c[
我想在函数调用 d(n) 之前比较 networkx.Graph 对象 n 的状态(有副作用)之后与国家合作。 有一些可变的对象节点属性,例如 n.node[0]['attribute'],我想对其进
我正在使用 NetworkX 生成一些噪声数据的图表。我想通过删除虚假分支来“清理”图表,并希望避免重新发明轮子。 例如,链接的图片显示了一组示例图形,作为由灰线连接的彩色节点。我想修剪白框指示的节点
我目前正在尝试制定一种算法来在图中查找派系,幸运的是我从 Networkx 找到了一个函数的文档,该函数就是这样做的。不幸的是,变量名有点简洁,我很难理解代码的每一部分的作用。 这里是 find_cl
我正在尝试使用 NetworkX 在两个节点之间添加平行边,但由于以下错误而失败。我究竟做错了什么? import networkx as nx import graphviz g1 = nx.Mul
我希望将 Pajek 数据集转换为 networkx Graph()。数据集来自哥斯达黎加Family Ties 。我正在使用非常方便的 networkx.read_pajek(pathname) 函
我在networkx中有一个巨大的图,我想从每个节点获取深度为2的所有子图。有没有一种好的方法可以使用networkx中的内置函数来做到这一点? 最佳答案 正如我在评论中所说,networkx.ego
我希望将 Pajek 数据集转换为 networkx Graph()。数据集来自哥斯达黎加Family Ties 。我正在使用非常方便的 networkx.read_pajek(pathname) 函
我在使用以下代码时遇到问题。边连接节点。但是是否有可能有一个定向网络,如果一个“人”跟随一个“人”,但它只是一种方式,在边缘有箭头或方向。 plt.figure(figsize=(12, 12)) #
我正在 Windows 机器上使用 Python 3,尽管付出了很多努力,但仍未能安装 pygraphviz。单独讨论。 我有networkx和graphviz模块...是否有一个范例可以在netwo
我正在使用《Python 自然语言处理》一书(“www.nltk.org/book”)自学 Python 和 NLTK。 我在 NetworkX 上被困在第 4 章第 4 部分第 8 部分。当我尝试运
下面是我的代码: import networkx as nx for i in range(2): G = nx.DiGraph() if i==0: G.add_ed
我正在使用 deap 符号回归示例问题中的这段代码,图形显示正常,但我希望节点扩展为圆角矩形以适合文本 自动 . (我不想只是通过反复试验来指定节点大小)。我该怎么做? # show tree imp
我正在尝试使用 networkx 读取 gml 文件(很简单吧?),除非我尝试读取文件时出现错误“networkx.exception.NetworkXError: cannot tokenize u
如何按厚度在networkx中绘制N> 1000个节点的加权网络?如果我有一个源、目标节点和每个边的权重的 .csv 列表,我正在考虑使用该方法: for i in range(N) G.add_ed
我希望 networkx 在我的定向中找到绝对最长的路径, 无环图。 我知道 Bellman-Ford,所以我否定了我的图长度。问题: networkx 的 bellman_ford() 需要一个源节
我在图中有一个节点,它充当一种“临时连接器”节点。我想删除该节点并更新图中的边,以便其所有直接前辈都指向其直接后继者。 在 networkx 中是否有内置功能可以做到这一点,还是我需要推出自己的解决方
我有两张彩色图表。我想确定它们是否同构,条件是同构必须保留顶点颜色。 networkx 中是否有算法可以做到这一点? 这些图是无向且简单的。 最佳答案 检查documentation对于is_isom
我有一组起点-终点坐标,我想计算它们之间的最短路径。 我的起点-终点坐标有时位于一条长直线道路的中间。但是,OSMnx/networkx 计算的最短路径不会考虑中间边到最近节点的路径。 OSMnx 或
我是一名优秀的程序员,十分优秀!