networkx里面自绘的边都是直的,当多个节点处于同一条直线还有连边的时候就特别难看。如果能否让networkx画弯曲的边,那么这种情况就可以好办的多了。

思路为:

  1. 绘制节点,获取节点的pos坐标。
  2. 在存在边的两个节点之间,使用贝塞尔插值生成两个节点之间曲线的节点坐标。
  3. 使用LineCollection绘制线即可。

下面为整理的代码:

__author__ = 'jmh081701'
import matplotlib.pyplot as plt
import numpy as np
import bezier
from matplotlib.collections import LineCollection
import networkx as nx
import randomG = nx.Graph()
G.add_nodes_from([0,1,2,3])
G.add_edge(0,1,weight=0.1)G.add_edge(1,2,weight=0.2)G.add_edge(0,2,weight=0.3)
G.add_edge(1,3,weight=0.4)
graph = G
def curved_line(x0, y0, x1, y1, eps=0.2, pointn=30):x2 = (x0+x1)/2.0 + 0.1 ** (eps+abs(x0-x1)) * (-1) ** (random.randint(1,4))y2 = (y0+y1)/2.0 + 0.1 ** (eps+abs(y0-y1)) * (-1) ** (random.randint(1,4))nodes = np.asfortranarray([[x0, x2, x1],[y0, y2, y1]])curve = bezier.Curve(nodes,degree=2)s_vals = np.linspace(0.0, 1.0, pointn)data=curve.evaluate_multi(s_vals)x=data[0]y=data[1]segments =[]for index in range(0,len(x)):segments.append([x[index],y[index]])segments = [segments]return  segments
def curved_graph(_graph, pos = None, eps=0.2, pointn=30):if pos == None:pos = nx.spring_layout(graph)for u,v in graph.edges():x0, y0 = pos[u]x1, y1 = pos[v]segs = curved_line(x0,y0,x1,y1)lc = LineCollection(segs)plt.gca().add_collection(lc)plt.gca().autoscale_view()if __name__ == '__main__':#画节点pos = nx.spring_layout(graph)nx.draw_networkx_nodes(G,pos, with_label=True)nx.draw_networkx_edges(G,pos)plt.show()#画曲线nx.draw_networkx_nodes(G,pos, with_label=True)curved_graph(graph,pos)plt.show()

直线连边版:

贝塞尔曲线连边版:

networkx画弯曲的边相关推荐

  1. networkx画中文节点 networkx画中文节点

    在这之前,也曾经想过用networkx画中文节点图,但是上网搜了下,感觉挺麻烦的,就一直没画.这次导师要我画一个中文图,尝试了gephi画,可是发现用"文件"菜单下的"打 ...

  2. Ubuntu系统python3.6版本,networkx画关系图显示中文处理

    先参考这篇文章: Ubuntu系统python3.6版本,networkx画关系图显示中文处理_u013617229的博客-CSDN博客 Ubuntu系统python3.6版本,networkx画关系 ...

  3. drawio 画弯曲的线框 漫画风

    drawio 画弯曲的线框 漫画风 效果预告 操作 效果预告 最近看到一种很温柔 drawio 风格,弯曲的曲线勾勒出各种形状,像雨天透过玻璃窗看到的湿哒哒的弯曲世界.如图. 操作 于是捣鼓了一波,也 ...

  4. networkx 画有权图_利用NetworkX画网络图

    现在各种商业和开源的网络可视化的工具非常多,NetworkX - NetworkX是一个非常重要的网络分析工具.当然它侧重于对网络结构的分析,也包含了网络可视化部分.我最近由于要画一些张量网络图,所以 ...

  5. networkx画有向图和无向图

    代码和结果如下所示: from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt import ...

  6. python的 networkx画网络结构图,节点大小能够随权重变化

    6-7和 7-6选取最大的作为权重 运行效果 首先的你得有csv文件: 长这样: 第一列对应起始,第二列对应终止,第三列对应权重 代码 # -*- coding:utf-8 -*-import net ...

  7. visio 画 弯曲 箭头 ( 波浪线 曲线)

    转自:http://blog.csdn.net/hfyinsdu/article/details/6619012 作者:hfyinsdu 示意图如下: 步骤 1. Visio 工具栏有个"连 ...

  8. matlab画弯曲圆柱体,matlab – 将平面弯曲成闭合的表面/圆柱体

    以下似乎或多或少地做了你想要的 %// Data xmin = -3; xmax = 3; %// this piece will get folded into a cylinder Rc = 5; ...

  9. python networkx 导入CSV文件画关系网络图

    文章目录 准备 一.无向图 二.有向图 参考链接 准备 Anaconda3中的Spyder 提前安装networkx. matplotlib 提示:以下是本篇文章正文内容,下面案例可供参考 一.无向图 ...

最新文章

  1. 分布式账本(Distributed ledger)
  2. 怎样解决VMware虚拟机无法连接外网问题
  3. jquery获取服务器控件的值
  4. 007-流程控制 if 语句
  5. java cha r转string_JAVA String.format 方法使用介绍
  6. Python的系统管理_08_python_异常处理
  7. 实习踩坑之路:快速失败:使用stream流便利集合的时候删除了对象,导致抛错Null
  8. 微信内下载APK 微信浏览器apk下载的解决方案
  9. c++游戏编程100事列_游戏编程入门(c++小游戏编程100例)
  10. 无线AP 传输、认证
  11. Web安全-浅析网页暗链与挂马攻击
  12. Rhino6.5软件安装包详细安装教程
  13. python实现排列组合公式C(m,n)求值
  14. MySQL中更新时间字段的更新时点问题
  15. JAVA:二进制与十进制转换
  16. 有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了...
  17. 把图片隐藏进音频详细教程(含软件下载及使用方法)
  18. goim 架构与定制
  19. docker pytorch-cuda 安装 devel 版本
  20. C语言小程序:如何用代码“画”出一个爱心

热门文章

  1. 学习诸如 Oculus Rift 等虚拟现实设备开发需要掌握哪些知识和技术?
  2. HCIA/HCIP使用eNSP模拟STP实验与STP根桥、根端口、指定端口选举方法
  3. SAP 响应时间 性能察看
  4. android版qq通讯录备份通讯录备份,安卓手机怎么备份通讯录 QQ同步助手备份通讯录方法-站长资讯中心...
  5. 大数据测试:功能和性能
  6. OpenWrt 软路由介绍
  7. 秒懂流媒体协议 RTMP 与 RTSP
  8. ip6tables匹配hoplimit
  9. Tomcat是什么东西?
  10. 手把手教你写批处理-批处理的介绍