如何调整Matplotlib子图图例位置,避免多子图图例重叠?
解决子图图例重叠问题
针对你遇到的两个水平子图图例重叠的问题,可以通过Seaborn Objects API的.legend()方法显式指定第一个子图图例的位置,将其移到左侧,避免和第二个子图的图例冲突。
修改后的完整代码
import matplotlib as mpl import seaborn.objects as so import seaborn as sns tips = sns.load_dataset("tips") f = mpl.figure.Figure(figsize=(8, 2), dpi=100) sf1, sf2 = f.subfigures(1, 2) # 第一个子图:指定图例位置为左侧 ( so.Plot(tips, "total_bill", "tip", color="day") .facet(col="day") .add(so.Dot(color="#aabc"), col=None, color=None) .add(so.Dot()) .legend(loc="upper left") # 关键:设置图例位置为左上 ).on(sf1).plot() # 第二个子图保持原有设置 ( so.Plot(tips, "total_bill", "tip") .add(so.Dot(color="#aabc")) .add(so.Dot(), data=tips.query("size == 1"), color="time") ).on(sf2).plot()
精细位置调整(可选)
如果需要让图例更贴合布局,避免遮挡绘图内容,可以用bbox_to_anchor参数自定义图例的坐标偏移:
.legend(loc="upper left", bbox_to_anchor=(-0.1, 1))
这个设置会让图例稍微移出子图的左侧边界,进一步避免和绘图元素重叠。
原理说明
Seaborn Objects API默认会在子图右侧生成图例,当两个子图水平紧密排列时就会出现重叠。通过.legend()方法指定loc参数(如"upper left"、"lower left"等),可以强制将图例放置在子图的左侧区域,从根本上解决重叠问题。
内容的提问来源于stack exchange,提问作者user21559775
相关产品推荐
相关产品推荐

