使用Python中的igraph为绘图添加标题和图例

news/2025/2/22 21:42:23/

igraph 中,可以通过添加标题和图例来增强图形的可读性和表达能力。我们可以使用 igraph.plot 函数进行绘图,并通过它的参数来指定标题和图例。

在这里插入图片描述

1、问题背景
python中的igraph库中,能否为绘图添加图例和标题?在手册或教程中都没有提到这个功能,但是在R中是可以的。

2、解决方案

R本身提供了一个相当高级的绘图系统,而R接口只是对其进行了利用,因此可以在R中轻松创建绘图标题和图例。Python默认不提供任何绘图功能,所以igraph使用Cairo库来绘制图形。然而,Cairo “仅仅” 是一个通用的矢量图形库。这就是为什么在Python中无法获得相同的先进绘图功能。
igraph的plot函数在后台创建了一个Plot对象,将要绘制的图形添加到绘图中,为其创建一个合适的Cairo表面,然后开始在Cairo表面上绘制图形。当你使用一个图表作为参数简单调用plot时,所有这些都是在幕后进行的。然而,你可以手动创建一个Plot对象,然后在绘图之前向其中添加标签,如下所示:

>>> plot = igraph.Plot("plot.png", bbox=(600, 600), background="white")

此时,你拥有了一个plot变量,它是igraph.drawing.Plot的一个实例。该绘图由一个600像素宽、600像素高的Cairo图像表面作为后备,并最终将被保存到名为plot.png的文件中。(你也可以直接在Plot构造函数的第一个参数中提供一个Cairo表面)。调用plot.redraw()将绘制绘图,但不会保存它。调用plot.save()将在绘图尚未绘制的情况下绘制它,然后将其保存到给定的文件名。
然后,你可以用plot做两件事:

  1. 将具有__draw__方法的任意对象添加到绘图中。图形对象有这样的方法,因此你可以将图形添加到绘图中,如下所示:
>>> g = igraph.Graph.GRG(100, 0.2)
>>> plot.add(g, bbox=(20, 20, 580, 580))
  1. 获取其surface属性以访问所进行绘制的Cairo表面,使用此表面构建一个Cairo画图上下文,然后使用画图上下文直接在绘图上用Cairo进行绘制。

第二种选择就是我们如何向绘图添加标签。幸运的是,igraph在igraph.drawing.text包中提供了一个名为TextDrawer的类来帮助我们解决一些换行和对齐问题。我们只需要创建一个TextDrawer,然后调用其draw_at方法在给定位置向绘图添加一个标签:

>>> import cairo
>>> context = cairo.Context(plot.surface)
>>> text_drawer = igraph.drawing.text.TextDrawer(context, text="Test label", halign=TextDrawer.LEFT)
>>> text_drawer.draw_at(x=100, y=100)

TextDrawer将使用Cairo上下文的当前字体绘制标签,因此你必须使用 القاهرة上下文的set_font_face、set_font_size和相关方法来调整用于绘制的字体。
综合起来,这个例子是这样的:

from igraph import Graph, Plot
from igraph.drawing.text import TextDrawer
import cairo# 构造绘图
plot = Plot("plot.png", bbox=(600, 650), background="white")# 创建图形并将其添加到绘图
g = Graph.GRG(100, 0.2)
plot.add(g, bbox=(20, 70, 580, 630))# 使绘图在Cairo表面上绘制自身
plot.redraw()# 获取表面,构造一个画图上下文和一个TextDrawer
ctx = cairo.Context(plot.surface)
ctx.set_font_size(36)
drawer = TextDrawer(ctx, "Test title", halign=TextDrawer.CENTER)
drawer.draw_at(0, 40, width=600)# 保存绘图
plot.save()

该示例将向绘图添加一个标题。构建图例更复杂,但我希望你能根据这个思路继续往下走。图例的标签可以通过反复调用TextDrawer的draw或draw_at方法来构建(当然,在重复调用之间调整TextDrawer的text属性)。你可以使用标准的Cairo调用在图例周围绘制一个盒子。你还可以使用igraph.drawing.shapes中的节点绘制器类,如果你想绘制与igraph在绘制图形时类似的节点形状。

igraph 没有直接的图例功能。可以通过 add_label 来模拟图例,或者你可以结合 matplotlibplot 外部添加自定义图例。

希望这个例子对你有帮助!如果需要更复杂的图例,可以结合其他绘图库,如 matplotlib,来进一步增强。


http://www.ppmy.cn/news/1524094.html

相关文章

动手学深度学习(pytorch土堆)-02TensorBoard的使用

1.可视化 代码使用了 torch.utils.tensorboard 将数据记录到 TensorBoard 以便可视化。具体来说,它将标量数据记录到目录 logs 中,使用的是 SummaryWriter 类。 代码分解如下: SummaryWriter("logs"):初始化一个 Ten…

Unity 之如何实现基于OpenAI的ChatGPT的聊天机器人

文章目录 前言接入说明Http请求GPT社区库1.C#/.Net的库2.OpenUPM库3.语音对话GPT实现Unity 接入OpenAI1.导入包2.设置你的 OpenAI 帐户3.向 OpenAPI 发出请求4.语音对话功能5.代码实现6.UI界面实现精彩推荐前言 在当前的技术环境中,人工智能聊天机器人越来越普遍。OpenAI的Ch…

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中,Rust开发环境需要依…

CSS实现优惠券透明圆形镂空打孔效果等能力学习

前言:无他,仅供学习记录,通过一个简单的优惠券Demo实践巩固CSS知识。 本次案例主要学习或巩固一下几点: 实现一个简单的Modal;如何进行复制文本到粘贴板;在不使用UI的svg图片的情况下,如何用C…

cyw43012 wifi+蓝牙二合一模块推荐

CYWL6302 超低功耗WiFi蓝牙模块参数介绍: 1、Wi-Fi 4 (802.11n and 802.11ac-friendly) Dual-band (2.4/5 GHz) MCS8 (256-QAM) for 20MHz channels, up to 78Mbps PHY data rate 2、major chip is cyw43012 3、Supports BDR (1Mbps), EDR (2/3Mbps), Bluetooth LE (1/2Mbps…

OpenCV结构分析与形状描述符(16)判断两个凸多边形是否相交的函数intersectConvexConvex()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 查找两个凸多边形的交集。 intersectConvexConvex 是一个在 OpenCV 中用于判断两个凸多边形是否相交的函数。此函数可以帮助我们确定两个二维凸多…

RISC-V (九)抢占式多任务

主要的思想:借用定时器中断实现。设置定时器寄存器,系统自动触发定时器中断时会跳到trap handler这个函数里。借用这个函数做上下文的切换,从而实现了抢占式多任务。 定时器中断:跳到trap handler函数,同时系统自动将…

TikTok运营需要的独立IP如何获取?

TikTok作为当下炙手可热的社交媒体平台,吸引了众多个人创作者和企业进驻。在进行TikTok运营时,许多经验丰富的用户都倾向于选择独立IP。那么,TikTok运营为什么需要独立IP?又该如何获取呢?本文将详细为您解答这些问题。…