我有这段代码:
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)
我的问题是我希望能够在输出图表中显示超过2种字体。
我想知道如何检测“font_family”的所有可能条目。
我从Networkx浏览了FontManager的代码,我只看到了“sans-serif”。
我在Ubuntu下的X11工作。
答案 0 :(得分:5)
在draw_networkx_labels
源代码中找到一点,它确实归结为对ax.text
的调用(其中ax是matplotlib轴)。这意味着您应该具有与任何普通MPL文本(docs)一样多的可配置性。
据我所知,字体名称是字体系列的一个实例;虽然因为 通用族(例如“serif”)通常作为字体系列的设置给出 变量。 http://www.w3schools.com/css/css_font.asp
这让我困惑了一段时间,所以如果我错了,请纠正我。
因此,如果您使用here中的技术:
avail_font_names = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
你得到所有(特定)选项。不知道你在哪里找到比这更完整的清单 泛型的font demo。
这篇文章展示了searching by name的方法:
[i for i in matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf') if 'times' in i.lower()]
从上面的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()
注意:如果在找不到表单“UserWarning:findfont:Font family ['sans-serif']时出现错误。回到......”,当尝试使用字体时,即使它们确实存在,这个nabble dialog建议清除字体缓存:( 是,这将无法删除文件,但会自动生成。)
rm ~/.matplotlib/fontList.cache