如何在Matplotlib与NetworkX中显示非英文字体?
解决NetworkX中波斯语(阿拉伯字母)标签显示空白的问题
我来帮你搞定这个波斯语标签显示的问题!出现空白方块的核心原因是Matplotlib默认不支持阿拉伯/波斯语的从右到左排版和字母连字特性,咱们用两个工具库就能完美解决。
第一步:安装必要依赖
先把处理文本和绘图需要的库装上,在终端运行:
pip install arabic-reshaper python-bidi matplotlib networkx
第二步:完整可运行代码
下面是调整后的代码,我会标注关键步骤:
from bidi.algorithm import get_display import matplotlib.pyplot as plt import arabic_reshaper import networkx as nx # 准备你的波斯语节点标签 nodes = ["سلام", "دنیا", "پایتون", "نتورک ایکس"] G = nx.Graph() G.add_nodes_from(nodes) # 定义文本处理函数:先处理字母连字,再调整排版方向 def fix_persian_text(text): # 重塑文本,让波斯语字母正确连写(解决字母分散的问题) reshaped_text = arabic_reshaper.reshape(text) # 调整为从右到左的显示顺序(符合波斯语阅读习惯) return get_display(reshaped_text) # 把所有节点标签替换成处理后的文本 processed_labels = {node: fix_persian_text(node) for node in G.nodes()} # 绘制网络图 pos = nx.spring_layout(G) plt.figure(figsize=(8, 6)) # 绘制节点、边和处理后的标签 nx.draw_networkx_nodes(G, pos, node_size=2000, node_color="#4CAF50") nx.draw_networkx_edges(G, pos, width=2) # 这里要指定支持波斯语的字体,比如IRANSans、Vazirmatn(确保系统已安装) nx.draw_networkx_labels(G, pos, labels=processed_labels, font_size=14, font_family="IRANSans") plt.axis("off") plt.show()
关键注意事项
- 字体必须到位:系统里得安装支持波斯语的字体,比如IRANSans、Vazirmatn。如果没装,先下载安装,然后把
font_family改成对应的字体名称。 - 处理顺序不能乱:一定要先调用
arabic_reshaper.reshape处理连字,再用get_display调整方向,反过来会导致排版完全错乱。 - Jupyter环境适配:如果在Jupyter Notebook里运行,记得开头加上
%matplotlib inline,不然图形可能显示不出来。
内容的提问来源于stack exchange,提问作者Rotail




