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
相关产品推荐
相关产品推荐

