如何移动Seaborn Objects绘图中含颜色与标记的完整图例
解决Seaborn Objects双图例移动问题
问题根源在于Seaborn Objects会为颜色和标记分别创建独立的图例对象,这两个图例都存储在figure.legends列表中,你之前只提取了第一个(颜色图例),导致标记图例没被移动。
完整解决方案代码
import matplotlib.pyplot as plt import seaborn as sns import seaborn.objects as so mpg = sns.load_dataset("mpg") f, axs = plt.subplots(1, 2, figsize=(8, 4)) _ = ( so.Plot(mpg, "weight", "acceleration", color="cylinders") .add(so.Dot(), marker="origin") .scale( color=["#49b", "#a6a", "#5b8", "#128", "#332"], marker={"japan": ".", "europe": "+", "usa": "*"}, ) .on(axs[0]) .plot() ) # 合并所有图例的手柄与标签 handles = [] labels = [] # 清空figure上的原有图例并收集元素 while f.legends: legend = f.legends.pop(0) handles.extend(legend.legend_handles) labels.extend([text.get_text() for text in legend.texts]) # 将完整图例添加到目标子图 axs[0].legend(handles, labels, loc="upper right") plt.show() # Python脚本运行需添加该行
关键步骤说明
- 遍历
f.legends列表,取出所有图例对象(这里是颜色和标记两个),分别提取它们的手柄(handles)和标签(labels)并合并。 - 调用子图的
legend()方法,将合并后的手柄和标签传入,即可把完整的双图例添加到子图指定位置(loc参数可按需调整,比如"lower right"、"center left"等)。 - 循环清空
f.legends是为了避免原有图例残留,确保只有子图上的新图例显示。
内容的提问来源于stack exchange,提问作者user21559775
相关产品推荐
相关产品推荐

