Matplotlib并排子图添加自动换行标题的问题与解决方案
解决Matplotlib子图标题自动换行问题
你用ax.text()设置wrap=True未生效的核心原因是:当使用transAxes坐标转换时,Matplotlib无法自动识别文本的可用宽度,需要手动限定范围;或者你可以改用更适配场景的set_title()方法来实现自动换行。
方案一:使用set_title()(推荐)
这是最直接的方式,set_title()默认会将标题宽度限制在子图轴的范围内,搭配wrap=True即可自动换行:
import matplotlib.pyplot as plt fig, axs = plt.subplots(nrows=1, ncols=2) axs[0].plot([1.0, 1.2, 0.9]) long_title = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.""" # 设置标题并开启自动换行 axs[0].set_title(long_title, wrap=True) # 第二个子图示例 axs[1].plot([0.8, 1.1, 1.3]) axs[1].set_title("测试长标题自动换行:这里输入足够多的文字来验证换行是否正常生效", wrap=True) plt.tight_layout() plt.show()
方案二:保留ax.text()并指定宽度
如果必须使用ax.text(),需要通过bbox参数明确文本的可用宽度(对应子图轴的范围),让Matplotlib知道在哪里换行:
import matplotlib.pyplot as plt fig, axs = plt.subplots(nrows=1, ncols=2) axs[0].plot([1.0, 1.2, 0.9]) long_text = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.""" axs[0].text( 0.5, # 水平居中 -0.2, # 位置调整到轴下方 long_text, transform=axs[0].transAxes, wrap=True, ha='center', # 水平居中对齐 # 指定bbox宽度为子图轴的范围(transAxes下width=1对应整个轴宽度) bbox=dict(boxstyle='square,pad=0', fc='white', ec='none', width=1, transform=axs[0].transAxes) ) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

