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

news2024/11/24 17:31:02

文章目录

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

需求

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

在这里插入图片描述

示例数据

**示例数据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 plt

from collections import OrderedDict
import math


def 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 points


def list2dict_tuple(lst):
    """
    根据list的元素个数, 定义字典的布局
    ===============================
    布局为一个圆形
    
    Paramters
    ---------
    lst: list
        输入list
        
    Retures
    -------
    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] = point

    return odict


def 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()  # 获取节点名称list
        posdict = 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.coloradmin.cn/o/1071360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python matplotlib 显示中文

最近再弄新的服务器,结果上面画图的时候没有中文。 用下面这段代码看一下是不是支持呢? from matplotlib.font_manager import FontManager import subprocess fm FontManager() mat_fonts set(f.name for f in fm.ttflist)print (mat_fonts) output…

[UE虚幻引擎] DTCopyFile 插件说明 – 使用蓝图拷贝复制文件 (Windows)

本插件可以在虚幻引擎中使用蓝图对系统的其他文件进行拷贝复制操作。 1. 节点说明 Async Copy File ​ 异步复制文件 Param Source File : 要复制的源文件的完整路径。Param Target File : 要复制的目标文件的完整路径。Param Force Copy : 如果为true,则如果目标…

ASPICE标准快速掌握「4.3. 工作产品特性表(WPCs)」

注:标注*的通用工作产品并没有在 Automotive SPICE 过程评估模型中使用,但是为了完整性而包含它们。 01-00 【配置项】 通过配置控制所维护的项: 可包括组件、子系统、库、测试用例、编译器、数据、文档、物理媒介和外部接口版本标识得到维护以下关于项的描述应包含: 项的类…

华为云CodeArts Check代码检查插件(Cloud IDE版本)使用指南

CodeArts Check Cloud IDE代码检查插件 感兴趣的小伙伴,可以试试使用我们的CodeCheck代码检查插件:>>>CodeArts Check代码检查插件免费体验 CloudIDE插件市场里,当前CodeCheck代码检查插件是精选插件>>>CodeArts Check代码…

LED灯实验--汇编

asm-led.S .text .global _start _start: /* 1. led灯的初始化 *//* 1.1 使能GPIOE、DPIOF外设控制器的时钟 */ldr r0, 0x50000A28ldr r1, [r0]orr r1, r1, #(0x3 << 4)str r1, [r0]/* 1.2 设置PE10、PE8、PF10引脚为输出模式 */ldr r0, 0x50006000ldr r1, [r0]bic r1,…

Swagger使用详解

目录 一、简介 二、SwaggerTest项目搭建 1. pom.xml 2. entity类 3. controller层 三、基本使用 1. 导入相关依赖 2. 编写配置文件 2.1 配置基本信息 2.2 配置接口信息 2.3 配置分组信息 2.3.1 分组名修改 2.3.2 设置多个分组 四、常用注解使用 1. ApiModel 2.A…

除静电离子风蛇的工作原理及应用

静电离子风蛇是一种通过产生大量负离子来中和空气中的静电荷的设备。它们通常用于防止静电对电子设备、印刷机、加工机等工业设备造成损害。 静电离子风蛇的工作原理是通过电离器将空气中的氧气分子转化为氧离子&#xff0c;然后将这些氧离子释放到空气中。这些氧离子会与空气…

竞赛选题 机器学习股票大数据量化分析与预测系统 - python 竞赛选题

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…

WIN10 NPM的安装

引言&#xff1a; 什么是node.js? javaScript是一门脚本语言&#xff0c;通常被用来编写、执行本地源代码。脚本语言需要一个解析器才能运行&#xff0c;HTML文件中的JavaScript代码由浏览器解析执行。而自行执行JavaScript代码则需要Node.js解析器才能运行。 每个解析器都…

Zabbix监控系统与部署添加 zabbix 客户端主机

目录 1 添加 zabbix 客户端主机 1.1 服务端和客户端都配置时间同步 1.2 设置 zabbix 的下载源&#xff0c;安装 zabbix-agent2 1.3 修改 agent2 配置文件 1.4 在服务端验证 zabbix-agent2 的连通性 1.5 在 Web 页面中添加 agent 主机 1 添加 zabbix 客户端主机 systemctl…

SpringCloud之Stream框架集成RocketMQ消息中间件

Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于 Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现&#xff0c;并引入了发布-订阅、消费组、分区这三…

Jenkins配置钉钉通知

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

Android原生实现控件阴影方案(API28及以上)

Android控件的阴影效果的实现方式有很多种&#xff0c;这里介绍一下另一种Android原生的阴影实现方案&#xff08;API28及以上&#xff09;。 我们利用elevation、outlineAmbientShowColor、outlineSpotShadowColor来实现一个带阴影的Button。 实现效果如下图&#xff0c;阴影宽…

第0章 前言

大家好&#xff0c;我叫 Rick Blyth&#xff0c;我是一名软件开发人员、企业家、创始人、博主和父亲 &#x1f44b; 几年前&#xff0c;在成功构建和扩展了一些自筹资金的 Micro SaaS&#xff08;微型 SaaS&#xff09; 应用后&#xff0c;我放弃了&#xff08;薪水不错但很糟…

SpringBoot 实现数据脱敏

SpringBoot 实现数据脱敏 前言Hutool 实现数据脱敏引入依赖脱敏工具类代码实现 使用注解的方式定义枚举自定义序列化类定义注解测试 前言 数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 数据脱敏常用规则有替换、重排、加密…

接口测试和性能测试的区别

最近我在一个论坛上看到了一个关于性能测试和接口测试的经典问题&#xff0c;问题如下&#xff1a; 问题&#xff1a;后端性能测试&#xff0c;一个功能其实都是由后台多个接口组成的。 例如一个单据的保存&#xff0c;可能后台需要调用几个接口。用LR录制这个功能做性能测试。…

Java如何进行数据脱敏

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 1 2 3 4 5 6 7 8 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用&#xff0c;请看下面具体实现 -- CONCAT(str1,str2,…)&#xff1a;返回结果为连接参数产生的字符串 -- LEFT(str,len)&#xff1a;返回从字符串st…

Vue Router的进阶

进阶 导航守卫 官方文档上面描述的会比较深奥&#xff0c;而守卫类型也比较多&#xff0c;其中包含了全局前置守卫、全局解析守卫、全局后置钩子、路由独享守卫、组件内守卫。每一种守卫的作用和用法都不相同。这会使得大家去学习的时候觉得比较困难&#xff0c;这边主要介绍…

如何平衡需求的优先级冲突?

每个项目都有各种需求&#xff0c;如业务需求、技术需求、用户需求、系统需求。我们需要对这些需求进行优先级排序&#xff0c;平衡不同利益相关者的需求&#xff0c;以更好满足客户需求&#xff0c;确保关键业务目标得到优先满足&#xff0c;并合理分配资源&#xff0c;避免资…

移植 NetXDuo 到 STM32F4 芯片

移植 NetXDuo 到 STM32F4 芯片 1. NetXDuo 和 ThreadX 源码获取2. 准备工作2.1 基本工程模板获取 —— CubeMx 3.ThreadX 移植3.1 添加到工程3.2 文件修改3.3 补充完成回调函数 4. NetXDuo 移植4.1 将 NetXDuo 添加到工程4.2 驱动层实现4.3 测试 1. NetXDuo 和 ThreadX 源码获取…