Matplotlib设置axes.unicode_minus=False仍报U+2212减号缺失警告如何解决?
问题根因
你设置matplotlib.rcParams['axes.unicode_minus'] = False未生效,是因为仅对已生成的x轴刻度标签单独配置了自定义字体,matplotlib自动生成symlog坐标轴负刻度时,仍会调用全局默认字体检查U+2212(Unicode减号)的字符支持,因此触发警告。
可行解决方案
- 方案1:全局配置自定义字体(推荐,一次配置全图生效)
将你的自定义字体注册到matplotlib并配置为全局默认字体,配合关闭Unicode减号的参数即可完全解决问题,不需要再单独循环修改刻度标签字体:
import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.font_manager %matplotlib inline # 字体配置 path = 'bahnschrift_reg.ttf' # 注册自定义字体 matplotlib.font_manager.fontManager.addfont(path) # 全局设置默认字体为Bahnschrift mpl.rcParams['font.family'] = 'Bahnschrift' # 关闭Unicode减号,使用ASCII减号 mpl.rcParams['axes.unicode_minus'] = False # 绘图代码 f, ax = plt.subplots(1,1) ax.set_xscale('symlog', linthresh=0.001) ax.set_xlim(-0.0001, 100) ax.set_ylim(0, 1.02) plt.show()
- 方案2:仅修改x轴刻度字体的适配方案
如果不需要全图使用该自定义字体,仅要x轴刻度使用,可以在修改标签字体前手动替换所有Unicode减号为ASCII减号:
# 原有绘图逻辑不变,替换设置刻度的部分代码 for label in ax.get_xticklabels(): # 替换Unicode减号为ASCII减号 raw_text = label.get_text() processed_text = raw_text.replace('\N{MINUS SIGN}', '-') label.set_text(processed_text) label.set_fontproperties(prop) # 若后续添加了带负号的y轴刻度、图例、标题等内容,也需要对应做替换处理
- 方案3:临时屏蔽警告(仅适合临时测试用,不推荐正式场景使用)
如果不需要修改渲染逻辑,也可以直接过滤对应类别的警告,不会影响正常绘图:
import warnings warnings.filterwarnings("ignore", message="Font 'default' does not have a glyph for.*U\\+2212")
内容的提问来源于stack exchange,提问作者marcodena
相关产品推荐
相关产品推荐

