draw_networkx_labels的可用"font-family"条目

ali*_*oar 4 ubuntu matplotlib font-family networkx

我有这个代码:

    labels_params = {"labels":{n: "" if n[0] == "." else n for n in G.nodes () },
                     "font_family":"sans-serif",
                     "alpha":.5,
                     "font_size":16 }

    draw_networkx_labels (G, pos, **labels_params)
Run Code Online (Sandbox Code Playgroud)

我的问题是我希望能够在输出图形中显示超过2种字体.

我想知道如何检测"font_family"的所有可能条目.

我从Networkx浏览了FontManager的代码,我只看到了"sans-serif".

我在Ubuntu下的X11工作.

Bon*_*fum 5

draw_networkx_labels源代码中略微调整一下,它确实归结为调用ax.text(其中ax是matplotlib轴).这意味着你应该拥有与任何普通MPL文本(docs)一样多的可配置性.

字体名称与字体系列

据我所知,字体名称是字体系列的一个实例; 但是因为通用族(例如'serif')通常作为字体系列变量的设置给出. http://www.w3schools.com/css/css_font.asp

这让我困惑了一段时间,所以如果我错了,请纠正我.

查找完整的字体列表

所以如果你使用这里的技术:

avail_font_names = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
Run Code Online (Sandbox Code Playgroud)

你得到所有(特定)选项.不知道在哪里找到比泛型字体演示更全面的列表.

这篇文章显示了一个按名称搜索的方法:

[i for i in matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf') if 'times' in i.lower()]
Run Code Online (Sandbox Code Playgroud)

在图表中为标签使用多种字体

avail_font_names上面的列表中,我为这个例子选出了三个; 您可能必须替换其中一些,具体取决于您安装的内容.

import matplotlib.pyplot as plt
import networkx as nx

font_names = ['Sawasdee', 'Gentium Book Basic', 'FreeMono', ]
family_names = ['sans-serif', 'serif', 'fantasy', 'monospace']


# Make a graph
G  = nx.generators.florentine_families_graph()

# need some positions for the nodes, so lay it out
pos = nx.spring_layout(G)

# create some maps for some subgraphs (not elegant way)
subgraph_members  = [G.nodes()[i:i+3] for i in xrange(0, len(G.nodes()), 3)]

plt.figure(1)
nx.draw_networkx_nodes(G, pos)


for i, nodes in enumerate(subgraph_members):
    f = font_names[(i % 3)]
    #f = family_names[(i % 4)]
    # extract the subgraph
    g = G.subgraph(subgraph_members[i])
    # draw on the labels with different fonts
    nx.draw_networkx_labels(g, pos, font_family=f, font_size=40)

# show the edges too
nx.draw_networkx_edges(G, pos)


plt.show()    
Run Code Online (Sandbox Code Playgroud)

显示不同字体标签的示例图

解决'落回......'的警告

注意:如果在找不到"UserWarning:findfont:Font family ['sans-serif']形式时出现错误.回到......",当尝试使用字体时,即使它们确实存在,这个麻烦的对话框建议清除字体缓存:(是的,这将无法挽回地删除文件,但它是自动生成的.)

rm ~/.matplotlib/fontList.cache 
Run Code Online (Sandbox Code Playgroud)

  • 你碰巧问我当天还需要解决一个非常相似的字体问题;)很高兴它有用. (2认同)