Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Matplotlib + NetworkX -在单个图形中绘制2个网络

Matplotlib + NetworkX -在单个图形中绘制2个网络
EN

Stack Overflow用户
提问于 2015-03-18 10:13:20
回答 1查看 3.8K关注 0票数 3

如果您知道如何使用Matplotlib,那么您可能可以在不了解NetworkX的情况下回答问题。

我有两个网络可以用NetworkX绘制,我想在一个图形中并排画,显示每一个的轴。本质上,这是在Matplotlib中创建两个子图的问题(这是NetworkX用来绘制图形的库)。

网络中每个节点的位置分布在0,area_size的区域内,但通常没有坐标x= 0.0或y= area_size的点。也就是说,点出现在0、area_size或更小的区域内。不是更大。

每个子图的比例应为0.8×1.0,用0.16x1.0的面积隔开。

本质上,它应该是这样的(假设area_size = 100)。

然后我必须在这2幅图之间画线,所以我需要一些方法回到每个图中的位置,以便连接它们。

生成、存储和分配节点位置如下

代码语言:javascript
运行
AI代码解释
复制
# generate and store node positions
positions = {}
for node_id in G.nodes():
    pos_x = # generate pos_x in [0.0, area_size]
    pos_y = # generate pos_y in [0.0, area_size]

    positions[node_id]['x'] = pos_x
    positions[node_id]['y'] = pos_y

    G.node[node_id]['x'] = pos_x
    G.node[node_id]['y'] = pos_y

然后将这些位置存储在字典pos = {node_id: (x, y), ...}中。NetworkX获取此结构来绘制nx.draw_network(G, pos=positions)正确位置上的节点。

现在,我要做以下几点:

  • 计算第一个网络在0,area_size上的位置,然后将它们扩展到0,area_size*0.8
  • 用同样的方法计算第二个网络的位置。
  • 将第二个网络的位置移到右边,将area_size*0.8 + area_size*0.16相加到x坐标
  • 设置数字大小(以英寸为单位) plt.figure(figsize=(h, w), dpi=100)
  • 设置x轴plt.xlim(0.0, area_size*0.8*2 + area_size*0.16)
  • 设置y轴plt.ylim(0.0, area_size)
  • 绘制第一个网络(传递其位置)
  • 绘制第二个网络(传递其位置)
  • 在两个网络之间画线

我得到的图有正确的比例,但轴没有显示正确的信息。我应该把轴藏起来,画假的吗?

我可能需要一些更好的程序来画出适当的分图。

我还注意到,当我导出到pdf时,我设置的数字大小并不总是受到尊重。

NetworkX用于绘制图形的函数是这些,特别是我使用的是网络

如果它们给我带来太多麻烦的话,我真的不介意画出单独的斧头。

EN

回答 1

Stack Overflow用户

发布于 2015-03-18 19:24:26

我发现要使Matplotlib产生精确的比例需要一些调整。通常,它需要做一些简单的计算来计算出你想要的比率(例如,你希望每个子图的高度是1.25它的宽度,通过你的测量)。

至于PDF不尊重数字大小,可能是因为您指定了DPI。不需要指定DPI,因为PDF以向量格式保存。或者您使用的是plt.tight_layout函数,它可能很有用,但可以改变图形大小。

在子情节之间划线是一场噩梦。首先,您必须使用变换从轴坐标系转换为图形坐标系。然后你可以把线直接画到图形上。这个职位可能会有帮助。

下面的代码应该会有帮助。您需要以多种方式对其进行调整,但希望它能够帮助您生成所需的数字。

代码语言:javascript
运行
AI代码解释
复制
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.lines as lines

# Generate some random graphs and positions for demonstrative purposes.
G1 = nx.gnp_random_graph(10, 0.2)
G2 = nx.gnp_random_graph(10, 0.2)
pos1 = nx.spring_layout(G1)
pos2 = nx.spring_layout(G2)

# Set up the figure with two subplots and a figure size of 6.5 by 4 inches.
fig, ax = plt.subplots(1, 2, figsize=(6.5, 4))

# Set the x and y limits for each axis, leaving a 0.2 margin te ensure
# that nodes near the edges of the graph are not clipped.
ax[0].set_xlim([-0.2, 1.2])
ax[0].set_ylim([-0.2, 1.2])
ax[1].set_xlim([-0.2, 1.2])
ax[1].set_ylim([-0.2, 1.2])

# Stretch the subplots up, so that each unit in the y direction appears 1.25
# times taller than the width of each unit in the x direction.
ax[0].set_aspect(1.25)
ax[1].set_aspect(1.25)

# Remove the tick labels from the axes.
ax[0].xaxis.set_visible(False)
ax[0].yaxis.set_visible(False)
ax[1].xaxis.set_visible(False)
ax[1].yaxis.set_visible(False)

# Set the space between the subplots to be 0.2 times their width.
# Also reduce the margins of the figure.
plt.subplots_adjust(wspace=0.2, left=0.05, right=0.95, bottom=0.05, top=0.95)

# Draw the networks in each subplot
nx.draw_networkx(G1, pos1, ax=ax[0], node_color='r')
nx.draw_networkx(G2, pos2, ax=ax[1], node_color='b')

# Now suppose we want to draw a line between nodes 5 in each subplot. First, we need to
# be able to convert from the axes coordinates to the figure coordinates, like so.
# (Read the matplotlib transformations documentation for more detail).
def ax_to_fig(coordinates, axis):
    transFig = fig.transFigure.inverted()
    return transFig.transform((axis.transData.transform((coordinates))))

# Now we can get the figure coordinates for the nodes we want to connect.
line_start = ax_to_fig(pos1[5], ax[0])
line_end = ax_to_fig(pos2[5], ax[1])

# Create the line and draw it on the figure.
line = lines.Line2D((line_start[0], line_end[0]), (line_start[1], line_end[1]), transform=fig.transFigure)
fig.lines = [line]

# Save the figure.
plt.savefig('test_networks.pdf', format='pdf')

编辑

上面的代码似乎并没有精确地在对应节点的中心之间绘制轴线之间的直线。删除ax.set_aspect函数修复了这个问题,但是现在的比例是错误的。为了适应这种情况,您可以手动更改节点的y位置( NetworkX使其变得比应该的要难得多)。接下来,您必须更改ax.set_ymin值以获得正确的比例,如下所示:

代码语言:javascript
运行
AI代码解释
复制
# Manually rescale the positions of the nodes in the y-direction only.
for node in pos1:
    pos1[node][1] *= 1.35
for node in pos2:
    pos2[node][1] *= 1.35

# Set the x and y limits for each axis, leaving a 0.2 margin te ensure
# that nodes near the edges of the graph are not clipped.
ax[0].set_xlim([-0.2, 1.2])
ax[0].set_ylim([-0.2, 1.55])
ax[1].set_xlim([-0.2, 1.2])
ax[1].set_ylim([-0.2, 1.55])
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29129636

复制
相关文章
关于图中节点间的概率求解问题
(本文年代久远,请谨慎阅读)前提:节点是含有若干特征(小节点)的大节点,大节点间连接实际为特征间的连接
ZONGLYN
2019/08/08
8580
Gephi节点颜色、大小、标签颜色和大小以及边排序。
1、点击[文件] 2、点击[生成] 3、点击[随机图] 4、点击[确定] 5、点击[大小] 6、点击[10] 7、点击[应用] 8、点击[颜色] 9、点击[Ranking] 10、点击[选择一种渲染方式] 11、点击[度] 12、点击[应用] 13、点击[颜色] 14、点击[默认] 15、点击[颜色] 16、点击[应用] 17、点击[颜色] 18、点击[颜色] 19、点击[OK] 20、点击[应用] 21、点击[大小]
裴来凡
2022/05/28
8.7K0
Gephi节点颜色、大小、标签颜色和大小以及边排序。
matplotlib画图中的各种设置
原文出处:https://www.jianshu.com/p/8006d74ac9e7
SL_World
2021/09/18
2.8K0
添加标签——给定标签选项
HTML: 1 <h3>haveTags</h3> 2 <div id="havetags"></div> 3 <hr /> 4 <h3>addTags</h3> 5 <div id="addtags"></div> 6 <button id="btn">返回的数组</button> CSS: 1 #havetags span, 2 #addtags span { 3 display: inline-block; 4 padding:
ProsperLee
2018/10/24
8870
添加标签——给定标签选项
识别图中的图形形状,颜色,位置,面积,周长。
1、点击[Matlab] 2、点击[命令行窗口] 3、按<Enter>键
裴来凡
2022/05/28
1.2K0
识别图中的图形形状,颜色,位置,面积,周长。
添加标签——无给定标签选项
HTML: 1 <!-- input输入标签,请以英文逗号分开 --> 2 <input type="text" placeholder="请以英文逗号分开" id="tagvalue" value="Prosper,Lee,无敌,的,存在" /> 3 4 <!-- 添加标签 --> 5 <button id="addbtn">无标签选项的添加标签</button> 6 7 <hr /> 8 9 <!-- 添加标
ProsperLee
2018/10/24
7630
添加标签——无给定标签选项
Python OpenCV查找图中的四边形/矩形
F:\opencv4.2_release\opencv\sources\samples\python\squares.py
Color Space
2020/08/06
16.3K1
任意位置删除节点
删除任意位置节点和添加任意位置节点其实差不多,都是要先找到n-1的位置,然后进行下一步的操作。 唯一有区别的是,需要用断开链接之后,需要用free把节点在堆上的内存清理掉。
用户7272142
2023/10/11
1570
任意位置删除节点
在指定位置按照需要在接边处进行融合
想法来源于某技术交流群,有朋友问起,如何可以进行这些数据的合并?这些数据,其实就是互联网电子地图中的建筑物轮廓,由于切片等原因,下载的数据都是分块的,而在实际使用中往往需要进行融合。
数据处理与分析
2019/07/31
6332
在指定位置按照需要在接边处进行融合
链表任意位置插入节点
之前我们的链表代码只能从头部插入节点,也就是通过修改head指向新节点,然后新节点指向head之前指向的节点达到增加头节点的目的。
用户7272142
2023/10/11
1890
链表任意位置插入节点
「微软」局部图协同过滤缓解数据稀疏问题
本文是针对图神经网络在推荐系统中的应用提出的相关方法LGCF,对于用户-商品交互数据稀疏的情况下,无法得到较好的embedding来计算偏好。LGCF不需要为每个用户和商品学习embedding,旨在将有用的 CF 信息编码到局部图中,并基于该图进行推荐。
秋枫学习笔记
2022/09/19
6930
Docsify 的边栏目录如何设置
如下图中的文档中的 docsify 边栏是如何设置的? 配置方法 在你的项目的 index.html 文件中,添加参数: loadSidebar: true 然后再在项目中添加一个 _sidebar.md 文件,这个文件的格式为: - CWIKIUS 文档概述 - [文档介绍和快速链接](README.md) - [公众平台](CONTACT.md) - Gradle - [Deploy](deploy.md) - 其他小工具 - [JWT](jwt/README.md) -
HoneyMoose
2020/11/29
1.3K0
Docsify 的边栏目录如何设置
input内文字与光标的初始位置调整
input {     /*方法一*/     text-align = center; /*placeholder文字居中*/     text-align = left; /*placeholder文字居左*/     text-align = right; /*placeholder文字居右*/     /*方法二*/     padding-left:10px; /*placeholder文字距左10px*/     padding-right:10px; /*placeholder文字距右10px
似水的流年
2020/09/10
3.7K0
ICLR2020 | CS-GNN:用平滑度刻画图信息的使用
今天给大家介绍香港中文大学和新加坡国立大学一起在ICLR2020上发布的一篇论文,该论文针对实际使用中GNN在图结构数据中能够获得多少性能的问题,提出了两种可以度量从图中获取的信息的数量和质量的平滑度指标,以及一个使用上述平滑度指标的GNN框架CS-GNN。实验显示,在不同类型的图上,对于特定任务而言,CS-GNN相比于现有的模型有更好的效果。
DrugAI
2021/02/01
8130
ICLR2020 | CS-GNN:用平滑度刻画图信息的使用
【CSS】CSS 背景设置 ② ( 背景位置 | 背景位置-方位值设置 )
background-position 属性值 可以是 length 长度 , 也可以是 position 方位 ;
韩曙亮
2023/03/30
4.1K0
【CSS】CSS 背景设置 ② ( 背景位置 | 背景位置-方位值设置 )
老大的位置还能坐多久?比特币“江湖地位”创历史新低
企鹅号小编
2018/01/04
5490
老大的位置还能坐多久?比特币“江湖地位”创历史新低
图神经网络的自监督学习
当标记样本有限时,作为一种利用大量未标记样本的新范式, 自监督学习(Self-Supervised Learning,SSL)正在兴起。SSL在自然语言和图像学习任务上取得了很好的性能。最近,有一种趋势是使用图神经网络将这种成功扩展到图数据。
智能生信
2021/04/13
1.6K0
图神经网络的自监督学习
在目标检测中如何解决小目标的问题?
在深度学习目标检测中,特别是人脸检测中,由于分辨率低、图像模糊、信息少、噪声多,小目标和小人脸的检测一直是一个实用和常见的难点问题。然而,在过去几年的发展中,也出现了一些提高小目标检测性能的解决方案。本文将对这些方法进行分析、整理和总结。
公众号机器学习与AI生成创作
2021/04/30
1.5K0
在目标检测中如何解决小目标的问题?
图表的标签显示设置
腾讯云商业智能分析产品由北京永洪商智科技有限公司提供,永洪BI-一站式大数据分析平台 图表标签设置是编辑报告中常见的操作,这里说一下图表标签设置的常见问题。图表标签显示设置具有一定的通用性,这里以柱
腾讯云商业智能分析团队
2017/08/28
2.8K0
图表的标签显示设置
点击加载更多

相似问题

在画布上打印div

10

在div上覆盖画布

10

在画布上绘画并自动删除它(HTML5)

21

在画布上绘图,添加贴纸,定制位图- Android

13

联合所有并维护活动记录关系?

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档