在R igraph中,有一种简单的方法可以为图形图上的顶点标签和其他文本设置自定义字体:
plot(G,vertex.label.family="DINPro")
但是,正如我所看到的,vertex_label_family
参数在python igraph中不可用。我花了一些时间找到能够设置标签字体的解决方法,因此我将在此处发布解决方案。我想知道是否有更优雅或更简单的解决方案。首先,我尝试context.select_font_face()
在igraph图对象的上下文中调用cairo ,但是可悲的是,该draw()
函数igraph.drawing.graph.DefaultGraphDrawer()
在每个对象中都将其覆盖plot.redraw()
:
lo = graph.layout_fruchterman_reingold()
sf = cairo.PDFSurface("test.pdf",1280,1280)
bx = igraph.drawing.utils.BoundingBox(10, 10, 1260, 1260)
plot = igraph.plot(graph,layout=lo,target=sf,bbox=bx)
plot._ctx.select_font_face("DINPro", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL)
plot.redraw()
plot.save()
所以这行不通。我将发布一个简单的解决方案。
我可以通过用DefaultGraphDrawer
新的替换类来设置顶点标签的字体,该类仅与原来的两行不同。我只是igraph/drawing/graph.py
从python发行版的site-packages目录中复制了文件,然后删除了除以外的所有其他类DefaultDraphDrawer
。导入之后,我添加了一行以导入AbstractCairoGraphDrawer
,并修改了__all__[]
列表:
from igraph.drawing.graph import AbstractCairoGraphDrawer
__all__ = ["DefaultGraphDrawerFFsupport"]
然后我重命名了DefaultGraphDrawer
该类,修改了它的字体选择部分:
class DefaultGraphDrawerFFsupport(AbstractCairoGraphDrawer):
...
def draw(...):
...
fontFamily = graph.font if hasattr(graph, "font") else "sans-serif"
context.select_font_face(fontFamily, cairo.FONT_SLANT_NORMAL, \
cairo.FONT_WEIGHT_NORMAL)
...
...
我将此文件(ig_drawing.py
)放在模块的目录中,然后将其导入。我可以通过将修改后的类作为函数的drawing_factory
参数来设置任何字体plot()
:
from ig_drawing import *
lo = graph.layout_fruchterman_reingold()
sf = cairo.PDFSurface("test.pdf",1280,1280)
bx = igraph.drawing.utils.BoundingBox(10, 10, 1260, 1260)
df = igraph.drawing.graph.DefaultGraphDrawer(ctx, bx)
graph.font = "DINPro"
plot = graph.plot(graph,layout=lo,target=sf,bbox=bx,vertex_label=graph.vs["label"],drawer_factory=DefaultGraphDrawerFFsupport)
a.plot.save()
如果您未设置graph.font
,则使用“ sans-serif”。而且,如果您提供的字体名称不存在,那么也不会出现错误消息,它会退回到系统的默认sans字体。
看起来默认的“ sans-serif”字体是在igraph中硬编码的,无论是在使用cairo曲面还是svg的绘图功能中。有没有更简单的方法来更改此设置?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句