【python】可视化-绘制带有边权重的无向图

文章目录

    • 需求
    • 示例数据
    • 代码实现

需求

输入数据表(矩阵),绘制无向图。

在这里插入图片描述

示例数据

**示例数据1:**3个特征之间的关系数据 (data1.txt)

featuresfeature1feature2feature3
feature110.60.8
feature20.610.3
feature30.80.31

**示例数据2:**4个特征之间的关系数据 (data2.txt)

featuresfeature1feature2feature3feature4
feature110.60.80.7
feature20.610.30.68
feature30.80.310.72
feature40.70.680.721

代码实现

import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as pltfrom collections import OrderedDict
import mathdef calculate_circle_points(n, r=1, center=(0, 0)):"""将圆按弧线等分后, 分割点的坐标=========================Parameters----------n: int等分的份数r: float, int, optional[1]圆的半径, 默认[1]center: tuple, optional [(0, 0)]圆的中心, 默认(0, 0)Returns-------points: list划分后的点坐标list"""points = []circumference = 2 * math.pi * r  # 圆的周长for i in range(n):theta = (i / n) * circumference  # 当前等分点所对应的弧长x = center[0] + math.cos(theta)  # x 坐标y = center[1] + math.sin(theta)  # y 坐标points.append((x, y))return pointsdef list2dict_tuple(lst):"""根据list的元素个数, 定义字典的布局===============================布局为一个圆形Paramters---------lst: list输入listRetures-------odict:根据list元素个数 返回每个元素位置字典"""n = len(lst)  # 节点数# 圈上的点坐标circle_points = calculate_circle_points(n)# 坐标和点构成字典odict = OrderedDict()for node_i, point in zip(lst, circle_points):odict[node_i] = pointreturn odictdef draw_nx_graph(matrix, outfig=None, fixed_node=False):"""输入矩阵数据,绘制无向图Parameters----------matrix: DataFrame矩阵数据比如, 多个特征间的相关性矩阵outfig: str, optional [None]默认None, 不输出绘图, 否则设置绘图路径fixed_node: bool, optional [False]固定节点位置- 特征较少时, 可设置为True- 特征较多时, 建议设置为False因为设置固定节点位置, 可能会影响节点之间的边连线或出现边的标签覆盖问题Returns-------None"""# 画布大小plt.figure(figsize=(4, 3))# 创建空的无向图G = nx.Graph()# 添加节点for node in matrix.columns:G.add_node(node)# 添加边for row, col in zip(*matrix.where(pd.np.triu(pd.np.ones(matrix.shape), k=1).astype(bool)).stack().reset_index().drop(columns=0).values.T):value = matrix.loc[row, col]G.add_edge(row, col, weight=value)# 绘制无向图edges = G.edges()weights = [G[u][v]['weight'] for u, v in edges]if fixed_node:# 固定节点位置 (特征较少时)nodelst = G.nodes()  # 获取节点名称listposdict = list2dict_tuple(nodelst)  # 根据list元素个数布局节点位置# posdict = {'feature1': (0, 0), 'feature2': (0, 1), 'feature3': (1, 0)}else: # 特征较多时posdict = None# print(posdict)nx.draw(G, pos=posdict,with_labels=True, font_size=5,  # 节点标签字体 node_color="lightblue",  # 节点颜色node_size=800, width=np.array(weights)*10,)if fixed_node:labels = nx.get_edge_attributes(G, 'weight')nx.draw_networkx_edge_labels(G, posdict, edge_labels=labels,label_pos=0.3,)# nx.draw_networkx_edge_labels(G, pos=nx.spring_layout(G), edge_labels=labels)else:print("NOTE: not fixed note pos, will not add labels of edges. ""And network graph will be changed, every time this script is executed.")# 输出绘图if outfig:plt.savefig(outfig)plt.show(block=False)plt.pause(1)plt.close()def main(datafile, outfig=None, fixed_node=False):# 读取数据matrix = pd.read_csv(datafile, sep='\t', index_col=0)# 调用函数绘制无向图draw_nx_graph(matrix, outfig, fixed_node)

使用示例1:

datafile = './data1.txt'
# outfig = './data1.nx_grpaph.pdf'
main(datafile, fixed_node=True, outfig=None)

在这里插入图片描述

示例2:

datafile = './data2.txt'
# outfig = './data2.nx_grpaph.pdf'
main(datafile, fixed_node=True, outfig=None)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/128397.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类? 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

抄写Linux源码(Day17:你的键盘是什么时候生效的?)

回忆我们需要做的事情: 为了支持 shell 程序的执行,我们需要提供: 1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的,所以需要这两个东…

CANoe.Diva生成测试用例

Diva目录 一、CANoe.Diva打开CDD文件二、导入CDD文件三、ECU Information四、时间参数设置五、选择是否测试功能寻址六、勾选需要测试服务项七、生成测试用例 一、CANoe.Diva打开CDD文件 CANoe.Diva可以通过导入cdd或odx文件,自动生成全面的测试用例。再在CANoe中导…

ml-dms-dataset实验

https://github.com/apple/ml-dms-dataset 数据集的两个问题: 部分图片失效images 和 labels不匹配 evaluation运行结果 论文中的结果: inference结果:

Linux TCP协议通信 (流程 三次握手 四次挥手 滑动窗口)

TCP通信流程 Socket函数 TCP通信实现&#xff08;服务器端&#xff09; #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() {//1.创建socketint lfd socket(AF_INET, SOCK_…

ToBeWritten之改进威胁猎杀:自动化关键角色与成功沟通经验

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

基础算法之——【动态规划之路径问题】1

今天更新动态规划路径问题1&#xff0c;后续会继续更新其他有关动态规划的问题&#xff01;动态规划的路径问题&#xff0c;顾名思义&#xff0c;就是和路径相关的问题。当然&#xff0c;我们是从最简单的找路径开始&#xff01; 动态规划的使用方法&#xff1a; 1.确定状态并…

LeetCode竞赛---第 366 场周赛

Problem: 100103. 分类求和并作差 &#x1f4da; 题目&#xff1a;给你两个正整数 n 和 m 。 现定义两个整数 num1 和 num2 &#xff0c;如下所示&#xff1a; num1&#xff1a;范围 [1, n] 内所有 无法被 m 整除 的整数之和。num1&#xff1a;范围 [1, n] 内所有 无法被 m 整…

漏洞复现--Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

机器学习---RBM、KL散度、DBN

1. RBM 1.1 BM BM是由Hinton和Sejnowski提出的一种随机递归神经网络&#xff0c;可以看做是一种随机生成的 Hopfield网络&#xff0c;是能够通过学习数据的固有内在表示解决困难学习问题的最早的人工神经网络之 一&#xff0c;因样本分布遵循玻尔兹曼分布而命名为BM。BM由二…

如何在VS2022中进行调试bug,调试的快捷键,debug与release之间有什么区别

什么是bug 在学习编程的过程中&#xff0c;应该都听说过bug吧&#xff0c;那么bug这个词究竟是怎么来的呢&#xff1f; 其实Bug的本意是“虫子”或者“昆虫”&#xff0c;在1947年9月9日&#xff0c;格蕾丝赫柏&#xff0c;一位为美国海军工作的电脑专家&#xff0c;也是最早…

JMeter压测如何分配业务比例?

在进行综合场景压测时&#xff0c;由于不同的请求&#xff0c;要求所占比例不同&#xff0c;那如何实现呢&#xff1f; 有人说将这些请求分别放到单独的线程组下&#xff0c;然后将线程组的线程数按照比例进行配置&#xff0c;这种方法不是很好&#xff0c;想想&#xff0c;不…