Matplotlib中如何用annotate在图例下方精准定位文本并保存PDF
简洁实现:将注释文本定位在图例右下角下方20像素
我完全懂你想要的——不想搞那些冗余的额外坐标轴操作,就想精准把注释钉在图例右下角往下20像素的位置,还要完美导出PDF对吧?下面给你一套极简方案:
关键思路
直接获取图例的像素边界框,计算出注释的目标位置后,把像素坐标转成图表的归一化坐标(避免导出PDF时错位),最后用annotate()精准定位。
完整代码示例
import matplotlib.pyplot as plt # 1. 先绘制你的基础图表和图例 fig, ax = plt.subplots() line1, = ax.plot([1,2,3], label="示例曲线1") line2, = ax.plot([3,2,1], label="示例曲线2") # 保存图例对象,方便后续获取位置 legend = ax.legend() # 2. 获取图例的右下角像素坐标 legend_bbox = legend.get_window_extent() # x1是图例右下角的x像素值,y0是右下角的y像素值(Matplotlib像素坐标系y轴向上) legend_right_x = legend_bbox.x1 legend_bottom_y = legend_bbox.y0 # 3. 计算注释的目标位置:右上角对齐图例右下角,y轴减20像素 annotate_right_x = legend_right_x annotate_top_y = legend_bottom_y - 20 # 4. 把像素坐标转成图表的归一化坐标(适配PDF导出的画布尺寸) annotate_xy = fig.transFigure.inverted().transform((annotate_right_x, annotate_top_y)) # 5. 添加注释文本,设置对齐方式为右上角 ax.annotate("这是你要显示的注释文本", xy=annotate_xy, xycoords='figure fraction', # 使用归一化坐标 ha='right', va='top', # 让注释的右上角对齐目标点 fontsize=10) # 6. 保存为PDF,避免元素被裁剪 plt.savefig("annotated_plot.pdf", bbox_inches='tight') plt.show()
重点细节解释
- 像素坐标转归一化坐标:因为直接用像素坐标的话,导出PDF时如果画布尺寸变化,位置会偏移;转成
figure fraction(0到1的范围)后,位置会自适应画布,完美适配PDF导出。 - 对齐方式设置:
ha='right'和va='top'确保注释文本的右上角正好落在我们计算的目标点上,完全符合你“注释右上角置于图例右下角下方20像素”的要求。 - PDF保存:加上
bbox_inches='tight'能确保图例和注释都被完整保存,不会出现裁剪问题。
内容的提问来源于stack exchange,提问作者Delory
相关产品推荐
相关产品推荐

