You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib坐标轴标签能否设置两种不同字体大小?

在Matplotlib/Seaborn的单个坐标轴标签中设置不同字体大小

当然可以实现啦!Matplotlib完全支持在单个坐标轴标签里设置不同的字体大小,不过没法像你设想的那样直接传多个fontsize参数,得换个思路——用它的富文本渲染功能或者组合文本对象来实现。Seaborn作为Matplotlib的上层库,同样适用这些方法哦。

方法一:使用TeX语法(简洁高效)

Matplotlib默认支持TeX格式的文本渲染,你可以通过TeX命令直接指定不同文本片段的字号。这种方法适合简单的文本组合,代码量很小:

import matplotlib.pyplot as plt
# 若环境未默认开启TeX渲染,可先开启(可选)
# plt.rcParams['text.usetex'] = True

plt.plot([1, 2, 3])
# 用\fontsize{字号}{基线间距}\selectfont指定样式,基线间距一般设为字号的1.2倍
plt.ylabel(r'\fontsize{20}{24}\selectfont Text 1 \fontsize{15}{18}\selectfont Text 2')
plt.show()

解释一下:\fontsize{20}{24}里第一个数值是字体大小,第二个是文本基线的间距(确保换行或多文本排版时对齐自然),\selectfont用于激活当前设置的字体样式。

方法二:组合文本对象(灵活可控)

如果需要更复杂的排版(比如不同颜色、字体样式,或者更精细的间距控制),可以直接创建多个TextArea对象,再拼接成一个整体作为坐标轴标签:

import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredOffsetbox, TextArea, HPacker

fig, ax = plt.subplots()
ax.plot([1, 2, 3])

# 创建两个不同字号的文本区域
text1 = TextArea("Text 1", textprops={'fontsize': 20})
text2 = TextArea("Text 2", textprops={'fontsize': 15})

# 水平拼接两个文本,sep参数控制文本间的间距
packer = HPacker(children=[text1, text2], align="center", pad=0, sep=5)

# 将拼接后的文本定位到y轴标签的位置
anchored_box = AnchoredOffsetbox(
    loc='center', 
    child=packer, 
    frameon=False,
    bbox_to_anchor=(0, 0.5),
    bbox_transform=ax.transAxes
)
ax.add_artist(anchored_box)

# 隐藏默认的空y轴标签
ax.set_ylabel('')

plt.show()

这种方法的优势是可以对每个文本片段单独设置样式(比如颜色、字体族),甚至添加图标等元素,非常灵活。

关于Seaborn的说明

Seaborn的所有绘图都是基于Matplotlib的Axes对象实现的,所以上面的方法完全可以直接套用。比如用Seaborn绘图时,先获取对应的Axes对象,再按上述方式设置标签即可:

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
ax = sns.barplot(x="day", y="total_bill", data=tips)
# 用TeX方法设置y轴标签
ax.set_ylabel(r'\fontsize{20}{24}\selectfont 总账单 \fontsize{15}{18}\selectfont (美元)')
plt.show()

内容的提问来源于stack exchange,提问作者MaxS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:19:49