完美解决Matplotlib绘图中、英文字体混显问题···

2023-10-28 12:34:04 浏览数 (2)

前言

今天是我的可视化课程上线的第216天,目前学员412人,每篇原创公众号都会记录这个人数,用来督促和激励我的原创内容。目前课程的主要方向是 科研、统计、地理相关的学术性图形绘制方法,后续也会增加商务插图、机器学等、数据分析等方面的课程。

参与课程的你将获取到:学员答疑、可视化资源分享、可视化技巧补充、可视化业务代做(学员和甲方对接)、副业交流、提升认知等等。

如何解决matplotlib绘图中、英文字体混显问题?

今天我们的学员私信了我一个绘图经常遇到的问题,特别是绘制带有中文的论文配图时,就是如何在同一幅插图中同时显示中英文?如下:

学员提问

这个问题我想大概也是很多小伙伴学习Python绘图之初遇到的比较多的问题啦,正好最近在整理可视化学习圈子的资料,也对这个问题进了整理,同时整理了两哥解决方法,如下:

  • 字体替代法

字体替代法,顾名思义,就是使用相近的字体仅限替代,同时也符合相关期刊对论文配图的字体要求,而且其也有固定的Python代码引用方式,如下:

代码语言:javascript复制
#绘图专用:
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams

config = {
            "font.family": 'serif',
            "font.size": 12,
            "mathtext.fontset": 'stix',#matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
            "font.serif": ['STZhongsong'],#华文中宋
            'axes.unicode_minus': False # 处理负号,即-号
         }
rcParams.update(config)

以上可以直接再运行绘制代码之前就统一设置,案例结果如下:

案例01

案例02

  • 新建字体法

新建字体法,就是将已有的字体通过特定方法合并,使其适合自己的绘图需求,如合并宋体 新罗马字体。可以通过开源的字体合并工具进行操作,如Warcraft-Font-Merger[1]工具。现给出合并字体的步骤,如下:

合并新罗马字体(times.ttf)与宋体(simsun.ttc),两种字体在Win10系统下的文件夹位置为:"C:/Windows/Fonts"。合并后的字体文件路径可查看Github说明,默认为"out.ttf"。

为方便读者,给出合并这两种特定字体的批处理脚本(简化查找字体并拖动文件的步骤)。

  1. 先在合并工具文件夹内,使用新建记事本文件然后改后缀名的方式,新建一个"a.bat"文件,注意后缀名是bat,不是txt!否则无法通过双击运行该文件。
  2. 右键编辑bat文件,将以下内容复制到bat文件里,并保存该文件
代码语言:javascript复制
%~d0
cd "%~dp0"

.otfccdump.exe --ignore-hints -o base.otd "C:Windowsfontstimes.ttf"
.otfccdump.exe --ignore-hints -o ext.otd "C:Windowsfontssimsun.ttc"

.merge-otd.exe base.otd ext.otd

.otfccbuild.exe -q -O3 -o times simsun.ttf base.otd

del base.otd ext.otd

pause
  1. 双击运行"a.bat"文件,合并后的文件在文件夹内,名称为"times simsun.ttf"

合并字体之后,在matplotlib绘制代码中引用构建的新字体,如下:

代码语言:javascript复制
from matplotlib import font_manager
from matplotlib import rcParams

# 字体加载
font_path = "新建字体地址"
font_manager.fontManager.addfont(font_path)
prop = font_manager.FontProperties(fname=font_path)
# print(prop.get_name())  # 显示当前使用字体的名称

# 字体设置
rcParams['font.family'] = 'sans-serif' # 使用字体中的无衬线体
rcParams['font.sans-serif'] = prop.get_name()  # 根据名称设置字体
rcParams['font.size'] = 10 # 设置字体大小
rcParams['axes.unicode_minus'] = False # 使坐标轴刻度标签正常显示正负号

绘图结果如下:

「提示」:在没有特殊要求的前提下,建议使用第一种方法(字体替代法)进行中英文字体引用样式。

如何快速科研绘图可视化技巧?

如何快速的科研论文绘图技巧?笔者给大家列举了以下几点:

  • 学习基本工具和软件: 先熟悉常用的科研绘图工具和软件,例如Python或者R语言等,选择一款适合你的工具。
  • 参考教程和指南: 在线教程、视频教程和指南是学习的好资源。
  • 模仿和实践: 查看优秀的科研绘图范例,模仿它们的风格和技巧。同时,勤练手,多做练习,实践是提高技能的关键。
  • 了解图表类型和用途: 了解不同类型的科研图表,例如折线图、柱状图、散点图等,以及它们在传达信息方面的优缺点。
  • 注重细节和清晰性: 细节决定成败,确保图表的字体清晰、线条精细、标签明了,避免视觉混乱。
  • 遵循学术规范: 遵循学术期刊或机构对图表的规定和要求,包括字体大小、图表标题、坐标轴标签等。
  • 请教专家或同事: 有条件的同学可以跟随一个大佬进行系统学习,向他们寻求指导和建议,可以加速你的学习过程。

这里笔者建议,在资金允许的前提下,可以报名一个长期有效的可视化课程,别报名那种合集资料、没后期服务的课程。建议参加那种作者本人录制视频、有详细代码和数据、有后期服务、有观课平台(如果这个都没有,真的不建议大家购买,说的再好都不要购买)。如果课程持续更新的最好,最好课程本人有一定影响力(比如出书或者大V),那样自己的权益也会受到保障。感兴趣的读者可以看下我们自己的课程介绍,可视化系列课程推文。完美满足我说的那几个条件····

系统学习可视化

当然,在学习数据可视化的道路上,你也有很多问题得不到解答,也可以加入我们的可视化课程(可视化系列课程推文)后,在学员群里和大家一起谈论,一起进步,或者直接向我提问。如果我觉得你的问题很具有普适性,我会把它写成文章发布在公众号上,让更多人看到,有关我们数据可视化系列课程的服务内容,可以参考下面的 阅读原文。

猜你喜欢

MATLAB绘图不好看?!不是,你是还没发现这几个工具包吧..

不是,这个地理数据工具这么强的吗?数据处理、可视化它都行..

这种环形图太难画?!带你一行代码搞定..

这种图太多人问了,绘制方法真的很简单..

不是,这封面图这么多人问的吗?教程来了

不用Seaborn,这个工具也能绘制超炫的统计图形···

NetworkX,网络结构图最强绘制工具·····

所有科研地理图形它都有,这个工具有点猛····

Nature、Science配图可以一键绘制?!我懵了···

节后第一天,就因为论文配图,被导师怼了一上午·····

plotnine,打死不学R语言, 我可以用Python到40岁.....

TUEplots,一天100张论文配图,导师惊了··· 参考资料

[1]

Warcraft-Font-Merger: https://github.com/nowar-fonts/Warcraft-Font-Merger。

0 人点赞