基于gradio+networkx库对图结构进行可视化展示

前言

在gradio框架下对蛋白质-蛋白质相互作用网络(PPI网络)进行可视化,并将其在网页前端进行展示。

方法

其实很简单

可以直接使用networkx画图后保存图片,然后使用Gradio框架的image组件进行展示即可。

但实际上gradio还配置了Plot组件,可以用于将matplotlib的figure进行展示

又由于networkx绘图本身又基于matplotlib,所以也可以完成展示。

接下来主要麻烦的地方就是networkx绘图的使用

networkx的设计模式是分离的,图结构的存储和绘制是分开的两个步骤

绘制的时候,需要传入点的坐标,这些坐标有一套成体系的算法,也就是layout算法。

首先绘制点,传入图G,传入layout算法的输出结果pos,然后可以自己设定节点颜色

边也是同理,由于边也是基于点计算的,所以传入点的pos和图的结构G就可以得知边应该怎么绘制,同样线条粗细、样式、颜色、alpha通道也都是可以调整的。

最后是标注label和图例legend绘制,字体、大小也都是可以调整的。

代码:

import random
import networkx as nx
from matplotlib import pyplot as plt
import gradio as grdef get_ppi_figure(xxx):# 假设这是查询PPI网络后的结果图GG = nx.Graph()G.add_edge('1','2',is_infer=True,weight=0.1)G.add_edge('2','1',is_infer=True,weight=0.3)G.add_edge('2','1',is_infer=True,weight=0.3)G.add_edge('2','1',is_infer=True,weight=0.3)G.add_edge('3','4',is_infer=True,weight=0.5)G.add_edge('4','5',is_infer=True,weight=0.7)G.add_edge('a','b',is_infer=False,weight=1.0)#设置查询中心点的颜色nodes = []node_color = []for u in G.nodes():nodes.append(u)if u == 'a':node_color.append("#FFFF00")else:node_color.append('r')#读取边的推理权重edge_is=[]infer_weight=[]edge_not=[]for u,v,d in G.edges(data=True):if d['is_infer']:edge_is.append((u,v))infer_weight.append(d['weight'])else:edge_not.append((u,v))fig =plt.figure()fig.add_subplot()pos = nx.spring_layout(G)# 在node_color传入颜色的list,即可实现每个点有不同的颜色nx.draw_networkx_nodes(G, pos, nodelist=nodes, node_color=node_color)nx.draw_networkx_edges(G, pos, edgelist=edge_not, edge_color='g', label="From Experiment")# 这里使用透明度alpha来表示推理的置信度nx.draw_networkx_edges(G, pos, edgelist=edge_is, edge_color='r', alpha=infer_weight, style="dashed", label="From Prediction")nx.draw_networkx_labels(G, pos)plt.legend(loc="upper right")plt.axis('off')return figdemo = gr.Interface(get_ppi_figure,gr.Textbox(label='Protein ID'),gr.Plot(label='PPI Graph'))
demo.launch(server_port=7000,share=False,debug=True,show_error=True)

采用circular layout 

 

但实践下来,还是感觉不够美观,使用Plot组件始终只是绘制了图片而已,并没有可以交互的图功能(比如拖拽节点,节点缓慢漂浮运动,双击节点整理layout,三维查看图结构等很帅的可视化)

后来搜索了一下cytoscape的可视化js插件,但是由于自己并不是开发前端的专业人员,没能看懂如何把cytoscape.js嵌入进gradio网页端,最后就不了了之了。

所以占坑待填吧,如果有大佬能在评论区给一点建议JS嵌入gradio的建议,感激不尽。

 

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

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

相关文章

Remora

Remora Remora 模型能够独立于碱基识别过程预测甲基化/修饰碱基的状态。Remora 仓库专注于准备修饰碱基训练数据和训练修饰碱基模型。此外,还提供了一些用于运行 Remora 模型和调查原始信号的功能。对于生产环境中的修饰碱基识别,建议使用 Dorado <https://github.com/na…

【大数据学习 | HBASE高级】hive操作hbase

一般在查询hbase的数据的时候我们可以直接使用hbase的命令行或者是api进行查询就行了&#xff0c;但是在日常的计算过程中我们一般都不是为了查询&#xff0c;都是在查询的基础上进行二次计算&#xff0c;所以使用hbase的命令是没有办法进行数据计算的&#xff0c;并且对于hbas…

Rust:原子操作 AtomicBool

在 Rust 中&#xff0c;你可以使用 std::sync::atomic 模块来进行原子操作。原子操作在多线程环境中特别有用&#xff0c;因为它们可以确保操作的原子性和可见性&#xff0c;从而避免数据竞争和其他并发问题。 为了读取和设置布尔值&#xff0c;你可以使用 AtomicBool 类型。以…

Python小游戏28——水果忍者

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; 【bash】 pip install pygame 《水果忍者》游戏代码&#xff1a; 【python】 import pygame import random import sys # 初始化Pygame pygame.init() # 设置屏幕尺寸 …

基于SpringBoot的养老院管理系统+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式&#xff0c;还极大地丰富了消费者的购物体验。随着技术的不断进步&#xff0c;AI在电商领域的应用越来越广泛&#xff0c;从个性…

卷积、频域乘积和矩阵向量乘积三种形式之间的等价关系与转换

线性移不变系统 线性移不变系统&#xff08;Linear Time-Invariant System, LTI系统&#xff09;同时满足线性和时不变性两个条件。 线性&#xff1a;如果输入信号的加权和通过系统后&#xff0c;输出是这些输入信号单独通过系统后的输出的相同加权和&#xff0c;那么该系统就…

基于51单片机的电子钟+秒表LCD1602仿真设计

电子钟秒表 0. 设计资料内容清单&&下载链接1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图 基于51单片机的电子钟秒表LCD1602仿真设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译…

unity 3d到idea

第一步&#xff0c;确保jdk,sdk,gradle版本一致 unity 3d的配置 idea配置 第二步&#xff0c;整个unity导出安卓项目到idea idea配置项目&#xff08;修改gradl配置&#xff09; gradle配置代码 distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin.z…

通过地址获取LONG和LAT并且存入csv

通过地址获取LONG和LAT并且存入csv 1. Address存在Address这个column里&#xff0c;从网上复制&#xff08;如果可以爬虫自动更好&#xff09; 2. 用代码获取GPS&#xff0c;再存入表格 import pandas as pd from geopy.geocoders import Nominatim from time import sleep#…

【日志】binlog 文件的三种格式类型

MySQL 的 binlog&#xff08;binary log&#xff09; 是一种日志文件&#xff0c;它记录了所有对数据库的数据更改操作&#xff0c;包括插入、更新、删除等。 主用于主从复制和数据恢复等操作。 binlog 文件的格式有三种主要类型&#xff1a;STATEMENT、ROW 和 MIXED。 1. STA…

微信小程序的云函数

微信小程序的云开发中&#xff0c;云函数是一种运行在云端的 Node.js 函数&#xff0c;它允许开发者在云端执行代码&#xff0c;而无需自己搭建服务器。编写云函数时&#xff0c;需要遵循一定的思维模式来确保代码的安全性、效率和可维护性。以下是编写云函数时的一些关键思维&…

要查看你的系统是 x64(64位)还是 x86(32位),可以按照以下步骤操作

文章目录 1. 通过“系统信息”查看系统架构2. 通过“设置”查看系统架构3. 通过命令提示符查看系统架构4. 通过 PowerShell 查看系统架构5. 通过文件资源管理器查看系统架构总结 要查看你的系统是 x64&#xff08;64位&#xff09;还是 x86&#xff08;32位&#xff09;&…

ARM 汇编指令

blr指令的基本概念和用途 在 ARM64 汇编中&#xff0c;blr是 “Branch with Link to Register” 的缩写。它是一种分支指令&#xff0c;主要用于跳转到一个由寄存器指定的地址&#xff0c;并将返回地址保存到链接寄存器&#xff08;Link Register&#xff0c;LR&#xff09;中。…

跟李笑来学美式俚语(Most Common American Idioms): Part 11

Most Common American Idioms: Part 11 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记&#xff0c;自用。 Github仓库链接&#xff1a;https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来&#xff08;或者clone到本地…

手机ip地址异常怎么解决

在现代社会中&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。然而&#xff0c;有时我们会遇到手机IP地址异常的问题&#xff0c;这不仅会影响我们的网络体验&#xff0c;还可能带来安全隐患。本文…

validate简单入门

validate第三方验证库 介绍&#xff1a; 在我们的平常业务中难免会遇到参数验证的情况&#xff0c;这就不免需要我们手动的为每组参数写一段代码&#xff1a;是否满足某种参数数据的传输格式&#xff08;json、xml等&#xff09;、是否满足参数字段的格式&#xff08;长度、字…

【Linux系统编程】第四十七弹---深入探索:POSIX信号量与基于环形队列的生产消费模型实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、POSIX信号量 2、基于环形队列的生产消费模型 2.1、代码实现 2.1.1、RingQueue基本结构 2.1.2、PV操作 2.1.3、构造析构…

炼码LintCode--数据库题库(级别:入门;数量:144道)--刷题笔记_01

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;入门&#xff1b;数量&#xff1a;144道&#xff09;--刷题笔记_01入门级别的笔记CRUD基本函数及语法汇总事务锁视图 炼码LintCode–数据库题库&#xff08;级别&#xff1a;入门&#xff1b;数量&#xff1a;144道&…

.length和.length()有什么区别?什么情况下使用哪个?

在编写程序的时候&#xff0c;我们经常发现有时候需要得到长度的时候我们使用函数.length&#xff0c;而有的时候用的却是.length()。 在对Java一知半解的时候&#xff0c;我曾产生了深深的疑惑&#xff0c;到底这两个有什么区别&#xff0c;为什么有时候要有括号&#xff0c;而…