如何在Python中重塑networkx图?

2024-01-13

所以我创建了一种非常幼稚(可能效率低下)的生成哈斯图的方法。

问题:

我有 4 个维度...p q r s .

我想统一显示它(超正方体),但我不知道如何重塑它。如何在 Python 中重塑 networkx 图?

我见过一些人们使用的例子spring_layout() and draw_circular()但它并没有按照我想要的方式成型,因为它们不统一。

有没有办法重塑我的图表并使其统一?(即将我的哈斯图重塑为超正方形状(最好使用nx.draw() )

Here's what mine currently look like: enter image description here

这是我生成N维哈斯图的代码

#!/usr/bin/python

import networkx as nx
import matplotlib.pyplot as plt
import itertools

H = nx.DiGraph()

axis_labels = ['p','q','r','s']

D_len_node = {}

#Iterate through axis labels
for i in xrange(0,len(axis_labels)+1):
    #Create edge from empty set
    if i == 0:
        for ax in axis_labels:
            H.add_edge('O',ax)
    else:
        #Create all non-overlapping combinations
        combinations = [c for c in itertools.combinations(axis_labels,i)]
        D_len_node[i] = combinations
    #Create edge from len(i-1) to len(i) #eg. pq >>> pqr, pq >>> pqs
    if i > 1:
        for node in D_len_node[i]:
            for p_node in D_len_node[i-1]:
                #if set.intersection(set(p_node),set(node)): Oops
                if all(p in node for p in p_node) == True: #should be this!
                    H.add_edge(''.join(p_node),''.join(node))

#Show Plot
nx.draw(H,with_labels = True,node_shape = 'o')
plt.show() 

I want to reshape it like this: enter image description here

如果有人知道制作哈斯图的更简单方法,请分享一些智慧但这不是这篇文章的主要目的。


这是一个务实的答案,而不是纯粹的数学答案。

我认为您有两个问题 - 一是布局问题,二是网络问题。

1. 网络

网络中的边太多,无法代表单位超立方体。Caveat我不是这里的数学专家 - 只是从绘图角度(matplotlib 标签)得出这个结论。如果我错了,请解释一下。

您想要的投影,例如沃尔夫拉姆数学世界 http://mathworld.wolfram.com/HasseDiagram.htmln=4 的哈斯图的页面只有 4 条边连接所有节点,而 2 位节点有 6 条边,3 位节点有 7 条边。你的图完全连接了每个“级别”,即 4-D 向量与 01值连接到所有向量 11value,然后用 2 连接到所有向量1价值观等。这在基于维基百科答案的投影中最为明显(下面的第二张图)

2. 投影

我找不到预先编写的算法或库来自动将 4D 超立方体投影到 2D 平面上,但我确实找到了几个例子,。由此,您可以计算出适合您的坐标集并将其传递到nx.draw() call.

这是一个例子 - 我包含了两个坐标集,一个看起来像上面显示的投影,一个匹配这个来自维基百科 https://en.wikipedia.org/wiki/File:Hypercubeorder_binary.svg.

import networkx as nx
import matplotlib.pyplot as plt
import itertools

H = nx.DiGraph()

axis_labels = ['p','q','r','s']

D_len_node = {}

#Iterate through axis labels
for i in xrange(0,len(axis_labels)+1):
    #Create edge from empty set
    if i == 0:
        for ax in axis_labels:
            H.add_edge('O',ax)
    else:
        #Create all non-overlapping combinations
        combinations = [c for c in itertools.combinations(axis_labels,i)]
        D_len_node[i] = combinations
    #Create edge from len(i-1) to len(i) #eg. pq >>> pqr, pq >>> pqs
    if i > 1:
        for node in D_len_node[i]:
            for p_node in D_len_node[i-1]:
                if set.intersection(set(p_node),set(node)):
                    H.add_edge(''.join(p_node),''.join(node))

#This is manual two options to project tesseract onto 2D plane 
# - many projections are available!!
wikipedia_projection_coords = [(0.5,0),(0.85,0.25),(0.625,0.25),(0.375,0.25),
                                (0.15,0.25),(1,0.5),(0.8,0.5),(0.6,0.5),
                                (0.4,0.5),(0.2,0.5),(0,0.5),(0.85,0.75),
                                (0.625,0.75),(0.375,0.75),(0.15,0.75),(0.5,1)]

#Build the "two cubes" type example projection co-ordinates
half_coords = [(0,0.15),(0,0.6),(0.3,0.15),(0.15,0),
               (0.55,0.6),(0.3,0.6),(0.15,0.4),(0.55,1)]
#make the coords symmetric
example_projection_coords = half_coords + [(1-x,1-y) for (x,y) in half_coords][::-1]

print example_projection_coords


def powerset(s):
    ch = itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s)+1))
    return [''.join(t) for t in ch]

pos={}
for i,label in enumerate(powerset(axis_labels)):
    if label == '':
       label = 'O'
    pos[label]= example_projection_coords[i]

#Show Plot
nx.draw(H,pos,with_labels = True,node_shape = 'o')
plt.show() 

注意 - 除非您更改我在上面 1 中提到的内容,否则它们仍然具有您的边缘结构,因此看起来与网络上的示例不完全相同。这是您现有的网络生成代码的样子 - 如果将其与您的示例进行比较,您可以看到额外的边缘(例如,我不这样做pr应该连接到pqs:

“两个立方体”投影

维基媒体示例投影


Note

如果您想进行自己的预测(并建立pos数学上),你可能会看看这篇研究论文 http://www.researchgate.net/profile/Daniela_Velichova/publication/265003103_MODELLING_OF_ORTHOGONAL_PROJECTIONS/links/54328df00cf225bddcc7b9c4.pdf.


EDIT:

好奇心战胜了我,我必须寻找一种数学方法来做到这一点。我发现这个博客 https://andrewharvey4.wordpress.com/2008/10/21/an-introduction-to-hypercubes/- 其主要结果是投影矩阵:

这促使我开发了这个函数来投影每个标签,将包含“p”的标签表示该点在“p”轴上的值为 1,即我们正在处理单位超正方体。因此:

def construct_projection(label):
    r1 = r2 = 0.5
    theta = math.pi / 6
    phi = math.pi / 3
    x = int( 'p' in label) + r1 * math.cos(theta) * int('r' in label) - r2 * math.cos(phi) * int('s' in label)
    y = int( 'q' in label) + r1 * math.sin(theta) * int('r' in label) + r2 * math.sin(phi) * int('s' in label)
    return (x,y)

为规则的 2D 八边形提供良好的投影,所有点都不同。

这将在上面的程序中运行,只需替换

 pos[label] = example_projection_coords[i]

with

pos[label] = construct_projection(label)

这给出了结果:

r1,r2,theta and phi随心所欲:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中重塑networkx图? 的相关文章

随机推荐

  • 如何绘制survreg(R的包生存)生成的生存曲线?

    我正在尝试根据生存数据拟合并绘制威布尔模型 该数据只有一个协变量 即从 2006 年到 2010 年运行的队列 那么 对于在后面的两行代码中添加什么来绘制 2010 年队列的生存曲线 有什么想法吗 library survival s lt
  • 如何在pygame中添加残像?

    由于角色移动是基于网格的 因此当角色从一个方格移动到另一个方格时 它们看起来有点奇怪 因为它们只是从一个方格出现到另一个方格 为了让动作感觉更自然 我想添加 残像 以便模拟平滑的动作 Demonstrational image Since
  • 多个 AsyncHttpClient get 请求填充一项活动

    我有一个 GameActivity 为了填充布局 我必须多次调用远程 API 并想知道使用 AsyncHttpClient 包完成此操作的最佳方法http loopj com android async http http loopj co
  • 我如何从网络元素获取文本并在控制台中打印(例如)

    我在从网页上的元素获取文本时遇到问题 我正在使用 TestCafe e2e 框架 想要将文本 Web 元素的内容打印到控制台 你能提供一些代码吗 const getInnerText ClientFunction gt homePage k
  • executionTimeout 在 asp.net mvc 上不起作用

    我尝试在 web config 中为 asp net mvc 应用程序设置executionTimeout
  • 数组指针什么时候有用?

    我可以声明 int ap N So ap是指向大小为 N 的 int 数组的指针 为什么这很有用 如果我将它传递给函数 它可以用它做哪些有用的事情 而它不能用指向数组内容的普通指针来做 C常见问题解答说 2 12 如何声明一个指向数组的指针
  • Gradle Xpp3 错误

    我在为发布版本执行 gradle 构建时收到此错误 错误 xpp3 定义的类与现在提供的类冲突 安卓 解决方案包括寻找更新版本或替代方案 没有同样问题的库 例如 httpclient使用HttpUrlConnection或者okhttp代替
  • Git 对 *.reg 文件显示“二进制文件 a... 和 b... 不同”

    有没有办法强制 Git 处理 reg文件作为文本 我正在使用 Git 来跟踪我的 Windows 注册表调整和 Windows 使用情况 reg对于这些文件 更新1 我让它运行差异 谢谢 安德鲁 然而 现在看起来像下面这样 这是编码问题吗
  • 我可以使用 AngularJs 指令将样式应用于伪元素吗

    我希望我在这里没有遗漏一些明显的东西 但我正在尝试学习 Angular 并且在尝试制定指令时遇到了问题 我正在尝试构建一个指令 该指令将从数据属性 背景图像 获取 url 并将其作为背景图像应用到伪元素 但我无法弄清楚如何定位 before
  • 在 GitLab TeamCity 中显示构建状态

    我已成功将 TeamCity 配置为自动从 GitLab 提取新签入的更改并构建它 下一步 我希望 GitLab 中的构建状态图标能够反映 TeamCity 的构建状态 在每次构建 TeamCity 构建时 GitLab 继续显示 buil
  • 程序接收信号SIGTRAP,跟踪/断点陷阱

    我正在调试一个 嵌入式 软件 我在一个函数上设置了一个断点 出于某种原因 一旦我到达该断点并且continue我总是回到该函数 这是一个初始化函数 只能调用一次 当我删除断点时 并且continue GDB 告诉我 Program rece
  • jQuery UI 主题和 HTML 表格

    有没有办法使用 jQuery CSS 主题来设置 HTML 表格 CSS 主题 我的所有组件看起来都属于同一组 除了 HTML 表格看起来不同 那里有很多资源 支持 ThemeRoller 的插件 jqGrid http www trira
  • django 表单发布请求在 __init__ 方法上引发错误

    我有一个 django 表单 它从视图中获取参数来根据用户实例初始化多项选择字段 加载模板时表单工作正常 当我提交表格时init表单中的方法会引发错误 My Model模型 py from django db import models f
  • Node.js 递归列出文件的完整路径[重复]

    这个问题在这里已经有答案了 各位晚安 我在使用一些简单的递归函数时遇到了麻烦 问题是递归列出给定文件夹及其子文件夹中的所有文件 目前 我已经成功使用一个简单的函数列出目录中的文件 fs readdirSync copyFrom forEac
  • 使用竞争检测器时可以跳过特定测试吗?

    Go Race Detector 的 goroutine 限制为 8192 至少在我的系统上 我运行的一项测试是查看我的服务器代码如何处理大量同时打开的连接 现在我正在尝试 gt 15000 当我跑步时go test race 因此 该特定
  • listfragment 与我的主抽屉重叠

    我是Android新手 我正在创建一个应用程序 并且我有一个列表片段问题 因为列表显示但它与标题栏重叠 我必须添加边距顶部来改变它 而且我正在使用抽屉并且当我尝试时要打开它在选项抽屉上显示的列表 请让我粘贴代码和图像 以便您可以了解更多信息
  • ASP.NET 5 MVC 6 通用存储库模式

    一直在到处寻找教程什么的 我一直在尝试将 MVC5 的旧通用存储库模式实现到新的 MVC6 项目中 我设置了 3 个类库 Core Data and Service 但是有一个问题IDBset 似乎我的智能感知不喜欢它 我尝试添加Syste
  • Android 设备上的大型应用程序数据存储在哪里?

    我目前面临一个问题 我应该将我的对象结构存储在 Android 设备上 用例 我正在开始调用应用程序服务器 在异步任务 http developer android com reference android os AsyncTask ht
  • 确定给定金额的找零组合

    我的任务是使用暴力编写一个算法来确定不同方式的数量 以及给定数量的变化的相关组合 找零将使用以下硬币 便士 1 美分 镍币 5 美分 一角硬币 10 美分 和 25 美分 25 美分 e g 输入 16 表示变化16美分 输出 可以通过 6
  • 如何在Python中重塑networkx图?

    所以我创建了一种非常幼稚 可能效率低下 的生成哈斯图的方法 问题 我有 4 个维度 p q r s 我想统一显示它 超正方体 但我不知道如何重塑它 如何在 Python 中重塑 networkx 图 我见过一些人们使用的例子spring l