Ubuntu系统python3.6版本,networkx画关系图显示中文处理
最近在学习用networkx库分析关系网。安装好networkx,配合matplotlib在最后生成图像的时候,结点一直显示方框,看了很多网友分享的解决方法,结合自己最后处理掉问题的思路,在此分享,希望可以帮助到有需要的朋友。
本文介绍的主要还是用的较多的字体文件替换法
最初的状况,如图显示,简直很恐怖,
显示问题
当运行代码时,显示如下:字体没有找到,返回默认字体DejaVu Sans
/home/****/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1316:
UserWarning:
findfont: Font family ['sans-serif'] not found.
Falling back to DejaVu Sans
(prop.get_family(), self.defaultFamily[fontext]))
- 分析matplotlib中font_manager源代码
发现变量self.defaultFamily[fontext]
;
if best_font is None or best_score >= 10.0:
if fallback_to_default:
warnings.warn(
'findfont: Font family %s not found. Falling back to %s' %
(prop.get_family(), self.defaultFamily[fontext]))
default_prop = prop.copy()
default_prop.set_family(self.defaultFamily[fontext])
return self.findfont(default_prop, fontext, directory, False)
顺着self.defaultFamily[fontext]
找下去,
发现,默认字体的确是DejaVu Sans,顺便验证了下;
self.ttffiles = findSystemFonts(paths) + findSystemFonts()
self.defaultFamily = {
'ttf': 'DejaVu Sans',
'afm': 'Helvetica'}
self.defaultFont = {}
可以看出上述代码中,寻找系统字体函数中有个变量paths
,继续找;
paths = [os.path.join(rcParams['datapath'], 'fonts', 'ttf'),
os.path.join(rcParams['datapath'], 'fonts', 'afm'),
os.path.join(rcParams['datapath'], 'fonts', 'pdfcorefonts')]
发现字体存放在os.path路径下, 通过函数rcParams['***']
找到
- 解决问题
根据os.path返回的结果,结合其他网友分享的文章得到最终的字体位置:
os.path + site-packages/matplotlib/mpl-data/fonts/ttf
将想使用的字体命名为DejaVuSans.ttf替换上述路径下的DejaVuSans.ttf即可。
显示如下
兜了一圈,其实最开始代码warning时就显示了调用地址,在这个地址基础上,再结合网友的方法其实就可以了。
/home/****/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1316:
个人错误地方:开始路径找错了,一直在
/anaconda3/pgks/matpltlib/lib/python3.6/site-packages/matplotlib
路径下更改字体和配置文件,路径后半部分一样的,误以为是调用的库,浪费了很多时间。