目录
0 前言
🙋欢迎光临我的博客!我衷心希望这里的分享能够对你有所帮助。祝愿你拥有美好的一天!☀️☀️☀️
1 问题背景
这是一个很有意思的现象:我们平时绘制论文表格时,通常只会选用一种字体——比如全部用黑体,或者全部用新罗马。但有时候,为了更清晰地展示信息,我们可能会需要混合使用不同的字体。
如果你也遇到过这样的需求,那么今天这篇博客,就是为你准备的。
2 问题解决
2.1 混合使用字体
这里我们以常见的搭配为例,将中文字体(黑体)与英文字体(Times New Roman)结合使用,具体代码如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import matplotlib.font_manager as fm
# 设置后端
matplotlib.use('Agg')
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体为黑体
plt.rcParams['font.family'] = 'sans-serif' # 使用无衬线字体
plt.rcParams['mathtext.fontset'] = 'stix' # 设置数学公式字体
plt.rcParams['mathtext.rm'] = 'Times New Roman' # 设置数学公式中的普通字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 查找Times New Roman字体
times_font = None
for font in fm.fontManager.ttflist:
if 'times new roman' in font.name.lower():
times_font = font.fname
break
if times_font is None:
times_font = 'DejaVu Serif'
# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]
# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02,]
# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))
# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)
# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))
# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)
# 为每个条形添加数值标签 - 确保每个条形只有一个标签
for i, weight in enumerate(attention_weights):
# 计算标签的x和y位置
x_pos = i
y_pos = weight + 0.012 # 统一的垂直偏移量
# 添加文本标签 - 直接使用ax.text,确保只添加一次
ax.text(x_pos, y_pos, f'{weight:.2f}',
ha='center', va='bottom',
fontsize=10, color='black',
fontproperties=fm.FontProperties(fname=times_font))
# 设置标题
title = ax.set_title(
'Figure 1. The example sentence',
fontsize=16, pad=20, fontweight='bold')
title.set_fontproperties(fm.FontProperties(fname=times_font, size=16))
# 设置Y轴标签
ylabel = ax.set_ylabel('Attention Weight', fontsize=14, fontweight='bold')
ylabel.set_fontproperties(fm.FontProperties(fname=times_font, size=14))
# 设置X轴标签
xlabel = ax.set_xlabel('Words', fontsize=14, fontweight='bold')
xlabel.set_fontproperties(fm.FontProperties(fname=times_font, size=14))
# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)
# 设置Y轴刻度标签字体
for label in ax.get_yticklabels():
label.set_fontproperties(fm.FontProperties(fname=times_font, size=12))
# # 添加水平网格线
# ax.yaxis.grid(True, linestyle='--', alpha=0.3, linewidth=0.5)
# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# 调整布局
plt.tight_layout()
# 保存图片
plt.savefig('picture.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture.png'")
最终的效果看起来是这样的:
2.2 全部使用黑体
使用单一字体(如全黑体)进行绘图时,通常能确保视觉风格的高度统一,尤其适用于强调简洁、规整或现代感的图表场景。具体代码如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 设置后端
matplotlib.use('Agg')
# 设置字体 - 全部使用黑体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体为黑体
plt.rcParams['font.family'] = 'sans-serif' # 使用无衬线字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]
# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02]
# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))
# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)
# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))
# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)
# 为每个条形添加数值标签 - 确保每个条形只有一个标签
for i, weight in enumerate(attention_weights):
# 计算标签的x和y位置
x_pos = i
y_pos = weight + 0.012 # 统一的垂直偏移量
# 添加文本标签 - 使用黑体
ax.text(x_pos, y_pos, f'{weight:.2f}',
ha='center', va='bottom',
fontsize=10, color='black')
# 设置标题 - 中文标题
title = ax.set_title(
'图1. 示例',
fontsize=16, pad=20, fontweight='bold')
# 设置Y轴标签 - 中文
ylabel = ax.set_ylabel('注意力权重', fontsize=14, fontweight='bold')
# 设置X轴标签 - 中文
xlabel = ax.set_xlabel('词语', fontsize=14, fontweight='bold')
# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)
# 设置Y轴刻度标签字体大小
for label in ax.get_yticklabels():
label.set_fontsize(12)
# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# 调整布局
plt.tight_layout()
# 保存图片
plt.savefig('picture.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture.png'")
具体输出结果如下:

2.3 自动选择使用字体
为简化流程,我们可以将字体选择交给程序自动配置,这往往能得到更协调且省心的结果😄
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 设置后端
matplotlib.use('Agg')
# 使用字体列表实现回退
# Matplotlib会按顺序尝试列表中的字体,直到找到能显示字符的字体
plt.rcParams['font.family'] = ['Times New Roman', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]
# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02]
# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))
# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)
# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))
# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)
# 为每个条形添加数值标签 - 数字会自动使用Times New Roman
for i, weight in enumerate(attention_weights):
x_pos = i
y_pos = weight + 0.012
ax.text(x_pos, y_pos, f'{weight:.2f}',
ha='center', va='bottom',
fontsize=10, color='black')
# 设置标题 - 混合中英文
title_text = 'Figure 1. 权重可视化'
ax.set_title(title_text, fontsize=16, pad=20, fontweight='bold')
# 设置Y轴标签 - 英文会自动使用Times New Roman
ax.set_ylabel('Attention', fontsize=14, fontweight='bold')
# 设置X轴标签 - 中文会自动使用黑体
ax.set_xlabel('Words', fontsize=14, fontweight='bold')
# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)
# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# 调整布局
plt.tight_layout()
# 保存图片
plt.savefig('picture_font_fallback.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture_font_fallback.png'")
print("字体设置: Times New Roman (主要) -> SimHei (中文回退) -> DejaVu Sans (备用)")
具体效果如下:

以上就是本次关于图表字体应用的分享。目前,我们主要以条形图为例进行了演示,但文中涉及的字体配置方法与设计思路,同样适用于折线图、饼图等其他常见图表类型。大家可以根据实际需求,举一反三,灵活替换。
结语: 恭喜你完成了这篇博客的阅读!我衷心希望我的分享能够为你带来启发和帮助。愿你拥有一个宁静而美好的夜晚,好梦相伴。🌛🌛🌛


3万+

被折叠的 条评论
为什么被折叠?



