使用Matplotlib子图绘制多个igraph子图时边颜色不显示
问题
我正在使用igraph分析网络,并从主网络中查找特定类型的三元组作为子图,这一步已成功完成。现在我尝试使用matplotlib将这些子图绘制在多面板图中,代码如下:
import pandas as pd import igraph as ig import matplotlib.pyplot as plt import math # some long hidden code here to generate the main network (g) # the triad pattern ffl = g.Isoclass(n=3, cls=7, directed=True) # finding the subgraphs sub = g.get_subisomorphisms_vf2(ffl) # trying to plot the subgraphs ffls = [] for i in range(len(sub)): vtx = g.vs.select(sub[i]) ffl = g.subgraph(vtx) ffl.vs['name'] = g.vs[sub[i]]['name'] ffls.append(ffl) visual_style = {'layout': 'reingold_tilford', 'vertex_label_size': 15} fig, axs = plt.subplots(nrows=7, ncols=4, figsize=(15,25)) plt.subplots_adjust(wspace=0.5, hspace=0.5) axs = axs.ravel() for ax in axs: ax.set_axis_off() for ffl, ax in zip(ffls, axs): ig.plot(ffl, target=ax, vertex_label=ffl.vs['name'], **visual_style) plt.show()
生成的图能正常显示所有子图,但主网络中已定义的边颜色未显示。我确认子图已保留边颜色属性,单独绘制子图时颜色正常,仅批量绘制时出现该问题。请问我哪里操作有误?使用plt.subplots时能否显示边颜色?
解答
问题根源是批量绘制时,igraph不会自动读取子图的边颜色属性,需要显式指定颜色参数。plt.subplots完全支持显示边颜色,只需调整代码传递颜色配置即可,以下是两种可行方案:
方案一:在绘图循环中直接传入边颜色
修改批量绘制的循环代码,显式将子图的边颜色属性传递给ig.plot():
for ffl, ax in zip(ffls, axs): ig.plot(ffl, target=ax, vertex_label=ffl.vs['name'], edge_color=ffl.es['color'], **visual_style)
方案二:动态更新视觉样式字典
如果需要复用样式配置,可以在循环中复制并更新visual_style,确保每个子图使用自身的边颜色:
for ffl, ax in zip(ffls, axs): plot_style = visual_style.copy() plot_style['edge_color'] = ffl.es['color'] ig.plot(ffl, target=ax, vertex_label=ffl.vs['name'], **plot_style)
两种方案都能让子图的边颜色在多面板图中正常显示,本质都是明确告诉igraph要使用子图中已有的color边属性。
内容的提问来源于stack exchange,提问作者Ana Nascimento
相关产品推荐
相关产品推荐

